Modulentwicklung für Rhasspy Sprachassistent

Begonnen von drhirn, 11 März 2021, 15:59:50

Vorheriges Thema - Nächstes Thema

drhirn


Beta-User

#1261
Zitat von: JensS am 29 März 2022, 17:45:18
Wo kann man sich beim RHASSPY (B.A.) einschreiben?  8)
https://forum.fhem.de/index.php/topic,126913.0.html  :P

(Zugegeben, meine sentences sind jetzt "reichlich abgefahren"...)

Zitat von: drhirn am 29 März 2022, 17:39:04
Danke. rhasspySpecials war die Lösung! Hatte ich probiert, wusste aber nicht, wie man das richtig verwendet.
Vorschläge zur Doku sind willkommen...

An der "SetTimer"/"GetTimer"-Doku habe ich geringfügig geschraubt, und mit der angehängten Fassung scheint auch die Raum- und Szenenanfrage was vernünftiges zu liefern 8) . (Nur nicht auf meinem Hauptsystem, da hat es bei meinem einzigen Szenen-Gerät die Szenen verschluckt, warum auch immer...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Weshalb integrierts du GetTimer in SetTimer? Eine Trennung in Set- und Get-Intents, wie bei SetOnOff/GetOnOff, wäre nachvollziehbar und würde einer gewissen Ordnung entsprechen.
Man muss zu viel Hintergrundwissen anhäufen, um RHASSPY richtig zu konfigurieren...
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.

drhirn

Zitat von: JensS am 29 März 2022, 18:20:48
Weshalb integrierts du GetTimer in SetTimer? Eine Trennung in Set- und Get-Intents, wie bei SetOnOff/GetOnOff, wäre nachvollziehbar und würde einer gewissen Ordnung entsprechen.

Den Gedanken hatte ich auch schon. Ich würde also Jens mit der Meinung unterstützen.

Beta-User

 ;D Der Grund ist relativ einfach: Den Code gab's grad fast umsonst second hand bei ebay...

Würde vorschlagen, hier nicht die Umleitung über "GetTimer" zu nehmen, sondern den umgekehrten Weg zu gehen und den ganzen Intent generisch zu benennen ("Timer").
Hintergrund wäre der Gedanke, den  eventuell dann noch aufzubohren ;) , und zwar um die Möglichkeit, generischen Code anzuflanschen: "welche Termine habe ich heute", "wer hat heute/demnächst Geburtstag", "wann kommt die Müllabfuhr"....
Das ginge zwar auch über GetState, allerdings gibt es da bisher keine Möglichkeit, Perl-Code anzuflanschen. Braucht man mAn. aber für sowas, und ich bin  nicht sicher, ob es sinnvoller wäre, das bei GetState zu erlauben (da ist es auch eine Frage der Syntax).

Meinungen dazu?

Was die Benennung von Intents angeht, gleich eine weitere Sache: Prinzipiell stellt sich auch die Frage, ob es nicht sinnvoller wäre, die Abfragen ChoiceRoom und ChoiceDevice zusammenzulegen und einen "Einheits-" Choice-Intent zu schaffen. Zum einen hatte ich nie an Szenen gedacht, zum anderen ist das Deaktivieren der Intents aufwändig und bzgl. der eigentlich beabsichtigten Begrenzung der Erkennung ja bekanntermaßen auch nicht im erhofften Maß zielführend...
Dazu kommt, dass eine etwas generalisierte Antwortmöglichkeit vermutlich intuitiver zu "besprechen" ist, also der Sprechende ggf. sogar mehr (oder andere) Infos liefert als vorgesehen ("ich hätte gerne die deckenlampe im esszimmer").

Meinungen dazu?



Den Grund für die verlorenen scenes bei meinem Verstärker habe ich vermutlich auch identifiziert: Da ist RHASSPY einfach schneller wie YAMAHA_AVR mit der Bereitstellung der setter. Es muss wohl eine 2. Schleife für die devicemap-Erstellung nach FHEM-Start her...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Bin nach wie vor für eine Trennung in Set und Get. Sonst werden die sentence-Files irgendwann unübersichtlich. Aber grundsätzlich bin ich da sehr situationselastisch.

Kann Timer eh nicht verwenden, solange uns keine schlaue Lösung für das "Satellitengruppen-Problem" einfällt.

Bzgl. Scenes wusste ich gar nicht, dass man die jetzt überhaupt steuern kann. Und auch nicht, wie. ;)

Beta-User

#1266
Zitat von: drhirn am 30 März 2022, 10:41:52
Bin nach wie vor für eine Trennung in Set und Get. Sonst werden die sentence-Files irgendwann unübersichtlich. Aber grundsätzlich bin ich da sehr situationselastisch.
...jedem sein Himmelreich ::) ...

Bin da relativ leidenschaftslos, für den ersten Wurf war es erst mal wichtiger, überhaupt Code zu haben, und da waren es einfach recht moderate Eingriffe, um das ans Laufen zu bringen.
Habe jetzt schlicht (ungetestet) die "Umleitungen" auf "Timer" eingebaut, dann kann es jeder halten, wie er will. Ich finde die Trennung komplett unnötig, da für alle "Timer"-Varianten dieselben Variablen (Textbausteinchen, v.a. "Label") gebraucht werden und ich die dafür erforderlichen Referenzierungen in sentences.ini nicht toll finde. Eine Leerzeile reicht mir, um optisch zu erfassen, dass es da um was anderes geht...

Zitat
Kann Timer eh nicht verwenden, solange uns keine schlaue Lösung für das "Satellitengruppen-Problem" einfällt.
Bevor ich jetzt lange in den Untiefen diverser Threads suche: Kannst du mir da schnell mal (wieder ::) ) auf's Pferd helfen? vielleicht fällt mir ja jetzt was ein...?

Zitat
Bzgl. Scenes wusste ich gar nicht, dass man die jetzt überhaupt steuern kann. Und auch nicht, wie. ;)
Hmmm, den SetScene-Intent gibt es ja gefühlt schon ewig, und ich meine auch, dass wir den ausgetestet gehabt hätten. Ich habe das in der Praxis allerdings nicht wirklich genutzt, vermutlich weil es in die Kategorie "warum funktioniert das eigentlich manchmal nicht?!?" gefallen war und auch sonst keiner großes Interesse an dem Thema gehabt zu haben schien...
Zwischenzeitlich ist mir auch klar warum, siehe letzten Beitrag ::) . Mein Testgerät ist zu langsam mit seiner eigenen Initialisierung...
Dazu kommt, dass es bisher auch mangels Nachfrage keinen gDT "scene" gab ("scene" scheint für sowas allgemein gebräuchlich zu sein?).

Der Ablauf ist der, dass RHASSPY Rhasspy mit "sprechbaren Namen" für jede Szene versorgt und die dann unter dem key "Scene" zurückliefert. RHASSPY macht dann den Versuch, das einer "technischen Szene" zuzuordnen, wie unter "set" am Device zu finden.

Aktueller rudimentärer "Satz" zum Testen:

[de.fhem:SetScene]
<de.fhem:SetOnOff.cmdmulti> <de.fhem:SetOnOff.den> $de.fhem.Device-scene{Device} [<de.fhem:SetOnOff.rooms>] auf [ ( die Szene | den Modus ) ] $de.fhem.Scenes [Modus]
"stelle den Verstärker auf den Musik hören modus" oder "stelle den Verstärker auf Musik hören" führen bei mir mit der Version von gestern (nach manuellem devicemap-update) zu "set Yamaha_Main scene scene1"

rhasspySpecials dazu sehen wie folgt aus:
scenes:scene1="Musik hören" scene2="Film ansehen" scene3=none scene4="vorderen Eingang auswählen"
priority: inRoom=volume outsideRoom=volume,scene
confirm: SetOnOff="wirklich $target $Value schalten?" SetScene

Na ja, anbei jedenfalls der in größeren Teilen ungetestete Versuch, das eine oder andere zu fixen bzw. zu ergänzen:
- "Timer" intent und "Derivate"
- "Choice" intent und die bisherigen beiden als "Derivate" (noch nicht irgendwo direkt verwendet)
- Initialisierungs-Timer für "langsame Klienten" (2 Minuten).
- gDT "scene", (Erwähnung in den zugelassenen gDT der commandref)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Zitat von: Beta-User am 30 März 2022, 12:20:48
Bin da relativ leidenschaftslos, für den ersten Wurf war es erst mal wichtiger, überhaupt Code zu haben, und da waren es einfach recht moderate Eingriffe, um das ans Laufen zu bringen.
Mach, wie du meinst. Wenn's jemandem nicht passt, kann er ja jederzeit einen Patch liefern.

Zitatda für alle "Timer"-Varianten dieselben Variablen (Textbausteinchen, v.a. "Label") gebraucht werden und ich die dafür erforderlichen Referenzierungen in sentences.ini nicht toll finde. Eine Leerzeile reicht mir, um optisch zu erfassen, dass es da um was anderes geht...
Das ist natürlich auch wieder wahr.

ZitatBevor ich jetzt lange in den Untiefen diverser Threads suche: Kannst du mir da schnell mal (wieder ::) ) auf's Pferd helfen? vielleicht fällt mir ja jetzt was ein...?
Das Problem ist, wenn ich gruppierte Satelliten habe (wohnzimmer.01, wohnzimmer.02), weiß RHASSPY nicht, an welchen Satelliten es dann den Timerablauf schicken soll. Weil die siteId "wohnzimmer" ist. Und man kann natürlich auch nicht aus einem anderen Raum einen Timer im Wohnzimmer stellen. RHASSPY müsste also wissen, welche siteIDs es in welchen Raum gibt. Und dann für die Ausgabe per Zufall einen auswählen bzw. auf ein "Special" hören.

ZitatHmmm, den SetScene-Intent gibt es ja gefühlt schon ewig, und ich meine auch, dass wir den ausgetestet gehabt hätten.
Tatsache. Der steht sogar im README in GitHub. Ohne Text ;D.
Aber deine Code-Beispiele haben in der Tat gerade meine grauen Zellen geweckt. Da war mal was...
Probier ich gleich nochmal.

drhirn

Oh Mann, ich hatte sogar einen SetScenes-Intent in den sentences. Ich werd echt alt...

Beta-User

#1269
Zitat von: drhirn am 30 März 2022, 16:02:03
Ich werd echt alt...
Ich bin es schon...

Die SuFu hat dann auch einen Treffer zu dem room2siteId-Thema geliefert.

Anbei der Versuch, das irgendwie zu lösen, ich kann aber für nix garantieren. Habe dazu eine Funktion reingewurstelt, die bei "speak" und "playWav" dann checken müßte, ob es eine explizite Zuweisung seitens des Users gibt (via Reading, siehe Readings-Beschreibung am Ende der commandref), ob es dafür einen 100%-Match in siteIds gibt oder ob wenigstens der "Startanteil" darin zu finden ist, und dann dasselbe nochmal veranstaltet für die ursprünglich übergebene siteId. Erst wenn darüber nichts gefunden wird, wird halt einfach die übergebene siteId verwendet (also im schlechtesten Fall der Raumname wie bisher).

Ansonsten habe ich noch eine "Durchbrechung" des Set/Get-Prinzips gemacht, indem bei SetScene jetzt ein Schlüssel {Get:scenes} einen Auswahldialog öffnen sollte, der verliest, was es am angefragten Device so alles gibt (braucht wieder einen update der de-cfg).

Bin selbst mal gespannt, ob das alles so reibungslos durchläuft, ist ausdrücklich experimentell!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Nope, leider.

hermes/tts/say:
{"text": "Taimer im Raum wohnzimmer ist gestellt auf 15 Sekunden", "siteId": "wohnzimmer.pc", "lang": null, "id": "ca732039-4784-41ed-bf6c-31006578fd8a", "sessionId": "wohnzimmer.pc-porcupine_raspberry-pi-3688bf24-5a42-4ab9-b24b-7b5abf5bcc25", "volume": null}

hermes/dialogueManager/startSession:
{"init":{"canBeEnqueued": true,"customData": "de.fhem","text": "Taimer abgelaufen","type": "notification"},"siteId": "wohnzimmer"}

Reading ist gesetzt:
room2siteId_wohnzimmer.pc wohnzimmer

drhirn

Zitat von: Beta-User am 30 März 2022, 16:41:23
Ansonsten habe ich noch eine "Durchbrechung" des Set/Get-Prinzips gemacht, indem bei SetScene jetzt ein Schlüssel {Get:scenes} einen Auswahldialog öffnen sollte, der verliest, was es am angefragten Device so alles gibt (braucht wieder einen update der de-cfg).

Du meinst so?
(was für szenen kennst du){Get:scenes} im $de.fhem.Room{Room}

Meldet bei mir: "Ich habe leider zu wenig Daten um den Vorgang auszuführen"

Beta-User

Das mit room2siteId ist anders rum gemeint:
room2siteId_wohnzimmer wohnzimmer.pc
Was steht im Reading "siteIds"?

Zitat von: drhirn am 30 März 2022, 17:01:48
Du meinst so?
(was für szenen kennst du){Get:scenes} im $de.fhem.Room{Room}

Meldet bei mir: "Ich habe leider zu wenig Daten um den Vorgang auszuführen"
Das ist als Device-Abfrage konzipiert, muss mal schauen, ob das überhaupt klappen kann, wenn man kein Device angibt (_vielleicht_ ginge das, wenn es im Raum nur ein Szenen-Gerät gibt).

Versuch's mal damit:
Welche (Szenen | Szenarien | Einstellungen){Get:scenes} (kennt|kann) [(der | die | das)] $de.fhem.Device-scene{Device}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

#1273
Zitat von: Beta-User am 30 März 2022, 17:24:43
Was steht im Reading "siteIds"?

Grummel. Jetzt
mobile-app6,wohnzimmer.pc,wohnzimmer.sofa,vorraum,küche,schlafzimmer,defhem
Vorher war da noch "wohnzimmer" dabei.

Ich hab jetzt im Wohnzimmer (wo ich allerdings derzeit nur einen Satelliten habe) und von der App aus getestet. Und beide Male kam die Ansage aus dem richtigen Satelliten. Braucht noch mehr Tests, aber sieht mal gut aus.
Ach ja, weil's eh falsch war, hab ich vor den Tests das Reading room2siteId_ wieder gelöscht.

Zitat
Versuch's mal damit:
Welche (Szenen | Szenarien | Einstellungen){Get:scenes} (kennt|kann) [(der | die | das)] $de.fhem.Device-scene{Device}
Immer noch zuwenig Daten.

Nur zur Sicherheit, ich rede von folgender LightScene:

defmod lightSceneWz LightScene HUEBridge_HUEDevice5 enoAcLightWzTable [...]
attr lightSceneWz genericDeviceType scene
attr lightSceneWz rhasspyMapping SetOnOff:cmdOn=set lightSceneWz scene AllesAn,cmdOff=set lightSceneWz scene AllesAus
attr lightSceneWz rhasspyName Licht,beleuchtung
attr lightSceneWz rhasspyRoom Wohnzimmer
attr lightSceneWz rhasspySpecials scenes:scene1="Alles an" scene2="Alles aus" scene3="Computerlicht" scene4="Esslicht"
attr lightSceneWz room Rhasspy,System->Devices



{"Device":"licht","Get":"scenes","confidence":1,"customData":"porcupine_raspberry-pi","input":"Welche scenes kennt das licht","intent":"SetScene","lang":null,"rawInput":"welche szenen kennt das licht","requestType":"voice","sessionId":"wohnzimmer.pc-porcupine_raspberry-pi-a1dbe020-a512-4c1c-895f-ebb9be832997","siteId":"wohnzimmer.pc"}

drhirn

Soooo, hab jetzt auch noch einen zweiten Satelliten angeschlossen und von der App aus einen Timer gestelllt. Was soll ich sagen, Antwort kommt aus einem Satelliten im Wohnzimmer. Sehr cool!