Modulentwicklung für Rhasspy Sprachassistent

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

Vorheriges Thema - Nächstes Thema

drhirn

Ich hab's nur kurz vor'm Heimgehen schnell zusammen geschustert. Kann gut sein, dass ich etwas übersehen habe.

Beta-User

Besser nachgefragt - ich mache auch ausreichend viele Fehler ::) ...
(Eher in Richtung Dr. Basch, falls mal ein Blick in den Code erforderlich werden sollte): Relativ ich oft lasse ich Codeteile, die wir vermutlich nicht mehr (oder noch nicht) benötigen deaktiviert im Code stehen, bis ich dann sicher bin, dass man das definitiv nicht mehr (funktional oder als Vergleich) braucht (fremde Teile fasse ich normalerweise nicht an). Erst dann fliegt es ggf. letztendlich raus.

@drhirn: Wenn das mit dem WDT (und der lib) fertig ist, könnten wir das dann auch hierher übernehmen und anschließend mal noch etwas aufräumen. Ist zwar "gefühlt" nicht mehr viel, aber schaden tut aufräumen eigentlich nie...

War bei den gDT-Geschichten irgendwas dabei, was interessant wäre oder nicht funktioniert hat? Hast du irgendwo "specials" gesetzt?
(Es klang nach nicht besonders vielen Devices, aber grade "am Anfang" ist jeder erledigte Punkt einer, über den der nächste nicht mehr stolpert, und dein Zoo ist wohl etwas anders als meiner...)
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 21 Mai 2021, 15:41:32
@drhirn: Wenn das mit dem WDT (und der lib) fertig ist, könnten wir das dann auch hierher übernehmen und anschließend mal noch etwas aufräumen. Ist zwar "gefühlt" nicht mehr viel, aber schaden tut aufräumen eigentlich nie...
Wenn wir womit fertig sind?

ZitatWar bei den gDT-Geschichten irgendwas dabei, was interessant wäre oder nicht funktioniert hat? Hast du irgendwo "specials" gesetzt?
Wie du sagst, es sind nicht viele Devices. Und nein, außer bei der LightScene und Timer keine Specials bisher.

A propos LightScene: Ich spreche bisher (rhasspyChannels) nur "Computerlicht", "Esslicht", etc. Täte ich gerne so beibehalten. Weil "Licht auf Esslicht" macht zwar Sinn, ist für mich faulen Menschen aber zu viel geredet ;D. Geht jetzt leider nicht, weil wir das Device brauchen. Bekommen wir das hin, dass automatisch das passende Device zur Szene gesucht wird?

Beta-User

Zitat von: drhirn am 21 Mai 2021, 15:48:22
Wenn wir womit fertig sind?
In dem Fall mache ich das ganz alleine "fertig": das Einbauen und Einchecken der "Register.pm"-lib in den WeekdayTimer (und ein paar Nebenarbeiten, und dann noch dasselbe in Twilight).

Zitat
Wie du sagst, es sind nicht viele Devices. Und nein, außer bei der LightScene und Timer keine Specials bisher.
:) Hatte schon vermutet, dass das Ausbleiben von Rückmeldung dann "funktioniert einfach" bedeuten sollte.

Zitat
A propos LightScene: Ich spreche bisher (rhasspyChannels) nur "Computerlicht", "Esslicht", etc. Täte ich gerne so beibehalten. Weil "Licht auf Esslicht" macht zwar Sinn, ist für mich faulen Menschen aber zu viel geredet ;D . Geht jetzt leider nicht, weil wir das Device brauchen. Bekommen wir das hin, dass automatisch das passende Device zur Szene gesucht wird?
Hmm, ja, nun, vielleicht, Kopfkratz (da habe ich ja mal wieder eine doofe Frage gestellt...)....

Auf die Schnelle: "Im Prinzip" sollte es möglich sein, den rawInput mit dem gemappten "Ausgangssatz" (also in deinem Fall: dem einen Wort) zu vergleichen und darüber dann wieder das Ausgangsdevice zu rekonstruieren (ggf. nur, wenn es nicht vorher klare Ergebnisse gibt).
Ich hatte das Problem bisher nicht, habe aber auch noch nicht so intensiv getestet, sondern war erst mal froh, (halbwegs) sinnvollen Input zur Weiterverarbeitung an Rhassy abliefern zu können. Und: Meine Szenennamen sind auch recht eindeutig; es gibt die "tech-scenes" 1-4 aus dem Yamaha und ein paar lightScene-Szenen, die man ja aber eindeutig benennen kann.

Sollten wir im Auge behalten und können ggf. dann Nachsteuern.
Das einzige Problem, das ich im Moment sehe: Wenn jemand identische oder ähnliche Szenen-Sätze hat, muss irgendwie priorisiert werden, also z.B. festgelegt, ob der "Sprachraum" wichtiger ist wie rawInput oder umgekehrt... Vermutlich sollten wir da etwas Erfahrungen und "Spielmaterial" für Code-Schnipsel sammeln.
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

Ist keine große Tragödie. Ich kann's ja weiterhin über rhasspyChannels machen.

Beta-User

Nachdem ich mir mal die aktuellen Slots und die SetScene.ini (kurz) angesehen habe, kam dann auch wieder eine Erinnerung an den "aktuellen Stand" hoch... Das ist irgendwie unfertig, der Hinweis ist schon berechtigt.
Irgendwie hatte ich noch keine "Vision" entwickelt, ob das mit oder ohne direkte ini gehen soll bzw. wie dann die automatisch erstellten sentences aussehen sollen, wie es mit (unbeabsichtigten?) "Doppelungen" sein soll, usw., usf..

Vermutlich sollten wir da mal sowas wie eine gemeinsame Vorstellung entwickeln, wie man das wirklich sinnvoll nutzen kann, also was will "man" wo sagen können, damit was passiert, wo soll welche Info herkommen, welche pattern, Variablen sollten wo verfügbar sein, welche "Schätzungen" sollen bei der Auswertung erfolgen, ...

(Vermutlich schwierig zu verstehen).

Stand an der Stelle ist also eher Machbarkeitsstudie, als "fertig" kann man den Teil wohl nicht bezeichnen.
Wer also Ideen hat (und die neuen slots etc. jetzt schon gesehen hat) möge sich dazu äußern ::) .
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

Ich wurde hier darauf hin gewiesen, dass bei analyzeAndRunCmd Befehle in Anführungszeichen nicht ausgeführt werden. Ich kann das leider nachvollziehen.

Wenn ich mir folgendes Beispiel bastle:

attr Fernseher rhasspyChannels Netflix=launchApp Netflix\
SkyOnline=set Fernseher launchApp SkyOnline\
YouTube="set Fernseher launchApp YouTube"

funktionieren die ersten beiden. Das letzte nicht.

Hab jetzt ziemlich viel herum probiert, komme aber nicht drauf, warum. Hast du eine Idee?

Das ist der Output im Log bei allen drei Varianten:

2021.05.25 12:46:53.275 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_MediaChannels => {"input": "schalte um auf Netflix", "intent": {"intentName": "de.fhem:MediaChannels", "confidenceScore": 1.0}, "siteId": "default", "id": "d0176c00-7d84-44e5-93b6-a6e0e51105c4", "slots": [{"entity": "de.fhem.MediaChannels", "value": {"kind": "Unknown", "value": "Netflix"}, "slotName": "Channel", "rawValue": "netflix", "confidence": 1.0, "range": {"start": 15, "end": 22, "rawStart": 15, "rawEnd": 22}}], "sessionId": "d0176c00-7d84-44e5-93b6-a6e0e51105c4", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "um", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 10, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 14, "time": null}, {"value": "Netflix", "confidence": 1.0, "rangeStart": 15, "rangeEnd": 22, "time": null}]], "asrConfidence": null, "rawInput": "schalte um auf netflix", "wakewordId": null, "lang": null}
2021.05.25 12:46:53.276 5: Parsed value: MediaChannels for key: intent
2021.05.25 12:46:53.276 5: Parsed value: Netflix for key: Channel
2021.05.25 12:46:53.278 5: Parsed value: schalte um auf Netflix for key: input
2021.05.25 12:46:53.279 5: Parsed value: d0176c00-7d84-44e5-93b6-a6e0e51105c4 for key: sessionId
2021.05.25 12:46:53.280 5: Parsed value: default for key: siteId
2021.05.25 12:46:53.280 5: Parsed value: schalte um auf netflix for key: rawInput
2021.05.25 12:46:53.281 5: Parsed value: 1 for key: probability
2021.05.25 12:46:53.283 5: handleIntentMediaChannels called
2021.05.25 12:46:53.284 5: room is identified using siteId as wohnzimmer
2021.05.25 12:46:53.284 5: Device selected (by hash, with room and channel): Fernseher
2021.05.25 12:46:53.285 5: analyzeAndRunCmd called with command: launchApp Netflix
2021.05.25 12:46:53.285 5: Fernseher launchApp Netflix is a normal command
2021.05.25 12:46:53.286 5: Response is: OK
2021.05.25 12:47:01.582 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_MediaChannels => {"input": "schalte um auf SkyOnline", "intent": {"intentName": "de.fhem:MediaChannels", "confidenceScore": 1.0}, "siteId": "default", "id": "5fbd571d-e8fe-4f20-b7d5-112f254341de", "slots": [{"entity": "de.fhem.MediaChannels", "value": {"kind": "Unknown", "value": "SkyOnline"}, "slotName": "Channel", "rawValue": "skyonline", "confidence": 1.0, "range": {"start": 15, "end": 24, "rawStart": 15, "rawEnd": 24}}], "sessionId": "5fbd571d-e8fe-4f20-b7d5-112f254341de", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "um", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 10, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 14, "time": null}, {"value": "SkyOnline", "confidence": 1.0, "rangeStart": 15, "rangeEnd": 24, "time": null}]], "asrConfidence": null, "rawInput": "schalte um auf skyonline", "wakewordId": null, "lang": null}
2021.05.25 12:47:01.583 5: Parsed value: 1 for key: probability
2021.05.25 12:47:01.583 5: Parsed value: SkyOnline for key: Channel
2021.05.25 12:47:01.584 5: Parsed value: MediaChannels for key: intent
2021.05.25 12:47:01.584 5: Parsed value: schalte um auf skyonline for key: rawInput
2021.05.25 12:47:01.585 5: Parsed value: default for key: siteId
2021.05.25 12:47:01.586 5: Parsed value: 5fbd571d-e8fe-4f20-b7d5-112f254341de for key: sessionId
2021.05.25 12:47:01.586 5: Parsed value: schalte um auf SkyOnline for key: input
2021.05.25 12:47:01.586 5: handleIntentMediaChannels called
2021.05.25 12:47:01.587 5: room is identified using siteId as wohnzimmer
2021.05.25 12:47:01.588 5: Device selected (by hash, with room and channel): Fernseher
2021.05.25 12:47:01.588 5: analyzeAndRunCmd called with command: set Fernseher launchApp SkyOnline
2021.05.25 12:47:01.588 5: set Fernseher launchApp SkyOnline is a FHEM command
2021.05.25 12:47:01.589 5: Response is: OK
2021.05.25 12:47:07.111 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_MediaChannels => {"input": "schalte um auf YouTube", "intent": {"intentName": "de.fhem:MediaChannels", "confidenceScore": 1.0}, "siteId": "default", "id": "59d60dcc-af23-4a4b-8202-e48a00383d4d", "slots": [{"entity": "de.fhem.MediaChannels", "value": {"kind": "Unknown", "value": "YouTube"}, "slotName": "Channel", "rawValue": "youtube", "confidence": 1.0, "range": {"start": 15, "end": 22, "rawStart": 15, "rawEnd": 22}}], "sessionId": "59d60dcc-af23-4a4b-8202-e48a00383d4d", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "um", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 10, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 14, "time": null}, {"value": "YouTube", "confidence": 1.0, "rangeStart": 15, "rangeEnd": 22, "time": null}]], "asrConfidence": null, "rawInput": "schalte um auf youtube", "wakewordId": null, "lang": null}
2021.05.25 12:47:07.112 5: Parsed value: YouTube for key: Channel
2021.05.25 12:47:07.112 5: Parsed value: MediaChannels for key: intent
2021.05.25 12:47:07.113 5: Parsed value: schalte um auf youtube for key: rawInput
2021.05.25 12:47:07.113 5: Parsed value: default for key: siteId
2021.05.25 12:47:07.114 5: Parsed value: schalte um auf YouTube for key: input
2021.05.25 12:47:07.114 5: Parsed value: 59d60dcc-af23-4a4b-8202-e48a00383d4d for key: sessionId
2021.05.25 12:47:07.115 5: Parsed value: 1 for key: probability
2021.05.25 12:47:07.116 5: handleIntentMediaChannels called
2021.05.25 12:47:07.119 5: room is identified using siteId as wohnzimmer
2021.05.25 12:47:07.119 5: Device selected (by hash, with room and channel): Fernseher
2021.05.25 12:47:07.120 5: analyzeAndRunCmd called with command: "set Fernseher launchApp YouTube"
2021.05.25 12:47:07.120 5: "set Fernseher launchApp YouTube" has quotes...
2021.05.25 12:47:07.122 5: ...and is now: set Fernseher launchApp YouTube (set Fernseher launchApp YouTube)
2021.05.25 12:47:07.123 5: Response is: OK

Beta-User

Na ja, die Anführungszeichen sind "leider" der Anzeiger dafür, dass (nur) replaceSetMagic stattfinden soll, was z.B. dann auch für die GetState-Geschichten genutzt wird. "Eigentlich" ist das ganze nur dahingehend inkonsitstent, dass nicht das Ergebnis in dem Fall gesprochen wird...

Das "Problem" ist eher (zusätzlich), dass hier bei "rChannels" (ausnahmsweise) nicht parseParams zum Einsatz kommt, was dann (aus heutiger Sicht gesprochen) irritierend ist. Für's erste sollten wir mal die Doku zu rChannels checken und ggf. klarstellen, dass hier bitte die Quotes nichts verloren haben. (rChannels war bisher nicht so in meinen persönlichen Fokus ::) ).
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

Ok.
daZiton hat ja eigentlich kein Problem mit Anführungszeichen, sondern mit Doppelpunkten im Befehl. Dabei ist er auf den Versuch mit den Anführungszeichen gekommen. Und die Doppelpunkte gehen halt leider auch nicht.

Beta-User

Hmm, nach etwas Grübeln über dem Code: eigentlich wird ja erst geprüft, ob der erste Begriff ein cmd ist. Die ":"-Prüfung kommt erst danach (in elsif). Von daher sollte das doch mit der "set"-Erweiterung auch ohne Quotes gehen, oder täuscht mich das?
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

Leider, da wird davon ausgegangen, dass da ein anderes Device gemeint ist

2021.05.25 13:43:55.479 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_MediaChannels => {"input": "schalte um auf YouTube", "intent": {"intentName": "de.fhem:MediaChannels", "confidenceScore": 1.0}, "siteId": "default", "id": "2e6c60a7-2a81-43f2-a3bc-cad755c10359", "slots": [{"entity": "de.fhem.MediaChannels", "value": {"kind": "Unknown", "value": "YouTube"}, "slotName": "Channel", "rawValue": "youtube", "confidence": 1.0, "range": {"start": 15, "end": 22, "rawStart": 15, "rawEnd": 22}}], "sessionId": "2e6c60a7-2a81-43f2-a3bc-cad755c10359", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "um", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 10, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 14, "time": null}, {"value": "YouTube", "confidence": 1.0, "rangeStart": 15, "rangeEnd": 22, "time": null}]], "asrConfidence": null, "rawInput": "schalte um auf youtube", "wakewordId": null, "lang": null}
2021.05.25 13:43:55.481 5: Parsed value: 1 for key: probability
2021.05.25 13:43:55.482 5: Parsed value: schalte um auf youtube for key: rawInput
2021.05.25 13:43:55.482 5: Parsed value: default for key: siteId
2021.05.25 13:43:55.483 5: Parsed value: schalte um auf YouTube for key: input
2021.05.25 13:43:55.483 5: Parsed value: 2e6c60a7-2a81-43f2-a3bc-cad755c10359 for key: sessionId
2021.05.25 13:43:55.483 5: Parsed value: YouTube for key: Channel
2021.05.25 13:43:55.484 5: Parsed value: MediaChannels for key: intent
2021.05.25 13:43:55.485 5: handleIntentMediaChannels called
2021.05.25 13:43:55.486 5: room is identified using siteId as wohnzimmer
2021.05.25 13:43:55.487 5: Device selected (by hash, with room and channel): Fernseher
2021.05.25 13:43:55.488 5: analyzeAndRunCmd called with command: launchApp You:Tube
2021.05.25 13:43:55.491 5: launchApp You Tube redirects to another device
2021.05.25 13:43:55.492 1: fhemicon.png
2021.05.25 13:43:55.493 5: Response is: OK

drhirn

Aber theoretisch funktioniert's ohne Anführungszeichen. Wenn ich den elsif ($cmd =~ m{:}x) { Block auskommentiere.
Es muss da also eine genauere Prüfung her.

Beta-User

Na ja, also eben hatte ich einen erfolgreichen Versuch (ohne Auskommentieren) mit:
attr Sonos rhasspyChannels Netflix=launchApp Netflix\
SkyOnline=set Fernseher launchApp SkyOnline\
YouTube=setreading Sonos open plugin://plugin.video.twitch/?channel_id=CHANNEL_ID&mode=play


$DEVICE wird nur bei Perl ersetzt...

Das Auskommentierte kommt erst danach und beginnt mit elsif. Sollte also gehen (wie geschrieben). Nur eben nicht mit $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

Ziton

Hallo drhirn und Beta-User,

hierüber geht die Kommunikation natürlich einfacher. Ich bin der Schuldige für diesen kleinen Stolperstein.

Ich würde die Device Angabe theoretisch nicht brauchen wenn das übergebene Device genutzt werden könnte.
Dazu müsste ich aber an der Überprüfung auf ":" vorbeikommen.

Kann man evtl. noch ein elseif einbauen das man durchläuft wenn man den Doppelpunkt doppelt "::" und in diesem Fall
ein Doppelpunkt entfernt wird? Das erste elseif dürfte dann natürlich nur bei einfachem Doppelpunkt anspringen.

Wenn zu aufwendig muss ich hart programmieren falls ich diese Funktion an der Stelle wie beschrieben nutzen möchte. Wäre eben leider nicht so smart.

Gruß Ziton

Beta-User

Dann mal willkommen im FHEM-Forum!

Bin etwas verwirrt, wie geschrieben hatte ich den "setreading"-Test erfolgreich durchgeführt (also eigentlich nur eine kleine Abwandlung des set-Befehls wegen des "Zieldummy", der das als set nicht kennt (zur Sicherheit...) ). Aber auch so kommt das bei mir im state an:YouTube=set Sonos open plugin://plugin.video.twitch/?channel_id=CHANNEL_ID&mode=play
Den Doppelpunkt zu escapen wäre etwas umständlicher, weil man das dann ggf. vorher irgendwo erledigen müßte und dann hinterher wieder an der richtigen Stelle zusammenbasteln.
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