Modulentwicklung für Rhasspy Sprachassistent

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

Vorheriges Thema - Nächstes Thema

Beta-User

#1245
Zitat von: drhirn am 29 März 2022, 10:49:01
Cool!
...das stand jetzt lange genug unter "ToDo", ohne dass sich jemand anders dazu hätte breitschlagen lassen ;D - und da sowas in pah's Testsuite auftaucht, war es schwieriger, diese Anforderung zu ignorieren ::) ...

Allerdings ist mir gestern noch was raus:
- zum einen CancelTimer+Testmodus => wurde doch gelöscht...
- ein key in der de-cfg fehlt noch für "NoIntentRecognized"

Da ich wegen dem ersten Punkt sowieso nochmal ran musste, habe ich mir für die Tests dann auch noch "MediaChannels" und "Shortcuts" angesehen. Da auch dort die ggf. auszulösenden Aktionen über die zentralen internen Ausführungs-Routinen laufen, sollte es unproblematisch sein, nun auch diese Zweige für die Tests zu aktivieren. Damit müßte dann alles testbar sein, was intern abläuft :) .
Custom Intents gehen prinzipbedingt nicht zu testen, aber das sollte verschmerzbar sein.

Falls du zum Testen kommst, kannst du dir für den key in der de-cfg gerne was ausdenken und die gesammelten Werke einchecken. Weiß nicht, wann ich dazu komme.

Zitat
Ein "stopp" wäre super, wenn der Timer klingelt. Aber ich weiß nicht, wie man das lösen könnte. Irgendwie hört Rhasspy nicht zu, während es Audio ausgibt.
Nun ja, ohne input kein output... Das muss demnach außerhalb gelöst werden.
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

Wie kann ich den "NoIntentRecognized" triggern?

Beta-User

Zitat von: drhirn am 29 März 2022, 11:23:24
Wie kann ich den "NoIntentRecognized" triggern?
:)
Dazu muss der Input entweder über msgDialog (an einem RESIDENT/GUEST) kommen, oder über ein AMAD.*-Gerät. Ist eine Folge von
Zitat von: Beta-User am 28 März 2022, 09:49:09
Notizen an mich selbst:
- die "not recognized"-Fälle sollte man bei den "echten" Messenger-Fällen vermutlich auch noch gesondert mit einer Antwort bedenken, damit der Anfragende jedenfalls eine Rückmeldung bekommt;
Ist also für einen "nur-Rhasspy"-Nutzer gar nicht so ohne weiteres nachzustellen ;D ...
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

Aha

Naja, habe mich für "Ich konnte leider keinen passenden Intent finden" entschieden und die beiden Files eingecheckt.

drhirn

Zitat von: Beta-User am 24 März 2022, 18:32:25
- GetState überarbeitet:
-- erlaubt es, beliebige Inhalte auszuwerten, indem in rhasspyMapping GetState mit einem type und einer stateFormat-artigen "response" angeben wird;
-- Status-Infos zu RHASSPY selbst können abgefragt werden (insbesondere auf den aktuellen Raum der Anfrage bezogen)

Kannst du das mal genauer erläutern bitte? Wie sieht z.B. dein Diesel-Preis Mapping aus?
Danke!

Beta-User

Zitat von: drhirn am 29 März 2022, 13:29:23
Kannst du das mal genauer erläutern bitte? Wie sieht z.B. dein Diesel-Preis Mapping aus?
Das sind eigentlich zwei bis 3 Themen...

"Diesel" ist eine "price"-Type-Anfrage, für die es in den fertigen Antwortsätzen eine Standardantwort gibt. Die Anfrage dazu sieht so aus:
was kostet{Type:price} (Diesel|Benzin:SuperE10|Super:SuperE5){Reading} [( in | an | bei )] $de.fhem.Device-info{Device}
Abgefragt wird (hier und im Moment) ein (gDT: info) HTTPMOD, der als Readings eben "Diesel", "SuperE10" und "SuperE5" kennt.

Richtig "frei" wird es, wenn man den Weg nimmt, wie im Wetter-Beispiel aus https://forum.fhem.de/index.php/topic,124240.msg1215241.html#msg1215241 aufgezeigt. Damit kann man dann im Prinzip völlig beliebige Abfragen und auch Infos/Readings von anderen Devices "vorlesen lassen", das "Reading" muss dann nicht mal exisitieren, sondern es genügt, wenn diese Bezeichnung als "Anker" im rhasspyMapping steht ;) .

Mein etwas ausgebauter Satz dazu:
wie ( ist | wird ){Type:heute} ( [das] wetter{Device} | [der] Wetterbericht{Device:wetter} [für] ) [ ( heute | morgen{Type:morgen} | übermorgen{Type:übermorgen} ) ]

Weiteres Beispiel dazu:
sind alle fenster{Type:openWindow} [und] [Türen] geschlossen{Device} 
ist irgendwo ein fenster{Type:openWindow} [oder eine tür] offen{Device:geschlossen}

führt zu folgendem monitoring-Device:
attr Fenster_monitoring genericDeviceType info
attr Fenster_monitoring rhasspyMapping GetState:type=openWindow,response=Es sind grade [Fenster_monitoring:allCount] Fenster und Türen offen.
attr Fenster_monitoring rhasspyName geschlossen


Antwort Teil 3 - RHASSPY-Abfragen sehen in etwa so aus:

(Wie kannst du mir helfen | was kannst du [alles] ){Type:generic}
(Was|welche geräte) kannst du [<rooms>] ( steuern | [(an|aus)] schalten ){Type:control}

(Ich habe grade noch ein paar weitere im Test (v.a. wegen Szenen), bin mir aber nicht sicher, ob/was davon genau schon funktioniert...).

Hoffe, es ist jetzt etwas klarer?
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

Ja, jetzt klarer. Aber noch nicht ganz klar. Den Rest werde ich durch ausprobieren rausfinden ;)

drhirn

Aaahhhmm, ich hab keinen GDT "info". Wo kommt der her?

Beta-User

...den hat "jemand" "erfunden", weil ihm nichts besseres eingefallen ist...
Bin für Alternativ-Vorschläge offen, in RHASSPY ist das halt ein "Marker", über den die Auswertung gewisser setter (z.B. update, reread, reload) zugelassen wird und (prinzipiell) die Abfrage von STATE.
Meine "wie wird das wetter"-Abfrage war ursprünglich nur ein Verlesen des STATE, den ich via stateFormat passend formatiert hatte. Das ist in der Leseansicht aber unübersichtlicher als das, was Weather standardmäßig macht, und "morgen" etc. kann es auch nicht, was mich dann auf den "Trick" mit den Pseudo-Readings gebracht hat...

Jetzt sind wir aber eigentlich schon mitten drin in der "anderen" Diskussion, wie man die neuen Optionen denn jetzt sinnigerweise nutzt, und was ggf. noch fehlt...
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 29 März 2022, 14:12:54
...den hat "jemand" "erfunden", weil ihm nichts besseres eingefallen ist...
Bin für Alternativ-Vorschläge offen, in RHASSPY ist das halt ein "Marker", über den die Auswertung gewisser setter (z.B. update, reread, reload) zugelassen wird und (prinzipiell) die Abfrage von STATE.
Hehe
Ich find "info" eh gut. Hab mich nur gewundert, dass der in meiner inzwischen ewig langen Liste an GDTs nicht drinnen war.


ZitatJetzt sind wir aber eigentlich schon mitten drin in der "anderen" Diskussion, wie man die neuen Optionen denn jetzt sinnigerweise nutzt, und was ggf. noch fehlt...
Dazu fehlt mir noch die Info, was eigentlich alles und wie geht.

Beta-User

Zitat von: drhirn am 29 März 2022, 14:37:02
Ich find "info" eh gut. Hab mich nur gewundert, dass der in meiner inzwischen ewig langen Liste an GDTs nicht drinnen war.
Bei mir gibt's keine vorgegebene Liste, aber verwendet wird halt nur das, was RHASSPY versteht...

Zitat
Dazu fehlt mir noch die Info, was eigentlich alles und wie geht.
Da sind wir zu zweit ;D ...

Im Ernst: Relativ viel bekommt man über pah's Testsuite raus, v.a., wenn man die "Raumbezogenheit" von RHASSPY mit berücksichtigt und "siteId2room_defhem" mal mit etwas unterschiedlichen Orten vor jedem Durchlauf befüllt.

Soweit ich das bisher beurteilen kann, kommt man dann v.a. zu folgenden Problemkreisen:
- Priorisierungen (kann der User entscheiden)
- "Mach heller", wenn es kein dimmbares angeschaltetes Gerät gibt*
- Szenenauswahl: was gibt es + Auswahldialog*
- Konfiguration von allgemeinen Abfragen; wie macht man das am cleversten...**

Vermutlich sollte ich jetzt mal meine vollständige GetStates-Sätze zeigen, dann kannst du aus der Differenz ggf. ableiten, wo grade mein Stand für Tests ist...:
[de.fhem:GetState]
query=<de.fhem:GetDate.query>
#[de.fhem:GetDate]
#query=( weißt du [bitte] | ( könntest | kannst ) du mir [bitte] sagen | sag mir [bitte] )
den=<de.fhem:SetOnOff.den>
rooms=<de.fhem:SetOnOff.rooms>
#rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})
\[<query>] ( wie ist der status | ( sag | sage ) [mir] [bitte] ){State} [(vom | von ( dem | der ) | (den (Stand|Zustand) [von] ) )] $de.fhem.Device{Device} [<rooms> | $de.fhem.Room-info]
(erneuere | aktualisiere ){Update} <den> $de.fhem.Device-info{Device}
was kostet{Type:price} (Diesel|Benzin:SuperE10|Super:SuperE5){Reading} [( in | an | bei )] $de.fhem.Device-info{Device}
wie ( ist | wird ){Type:heute} ( [das] wetter{Device} | [der] Wetterbericht{Device:wetter} [für] ) [ ( heute | morgen{Type:morgen} | übermorgen{Type:übermorgen} ) ]
Welche ( Räume:rooms | (Szenen | Szenarien | Einstellungen):scenes){Type} kennst du [<rooms>]
Welche (Szenen | Szenarien | Einstellungen){Type:scenes} (kennt|kann) [(der | die | das)] $de.fhem.Device-scene{Device}
(Wie kannst du mir helfen | was kannst du [alles] ){Type:generic}
(Was|welche geräte) kannst du [<rooms>] ( steuern | [(an|aus)] schalten ){Type:control}
welche Informationen (kannst|kennst){Type:info} du [<rooms>] [( liefern | [an] sagen | nennen )]
sind alle fenster{Type:openWindow} [und] [Türen] geschlossen{Device} 
ist irgendwo ein fenster{Type:openWindow} [oder eine tür] offen{Device:geschlossen}


* wären Punkte, die man im Modul ggf. mit lösen muss, bei ** braucht es ggf. zusätzlich eben noch weitere Klärung, was überhaupt in welcher Form Sinn macht...
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

#1256
Muss ich mir ansehen.

Mal was anderes: Ich hab ja - wie du - ein HM Thermostat. Da würde ich gerne die aktuelle Temperatur und die aktuelle Solltemperatur abfragen. Also bei _Weather und _Climate jeweils ein GetNumeric Mapping erstellt. rhasspyName bei _Weather ist "temperatur", bei _Climate "heizung".
Frage ich jetzt nach "wie warm ist es im wohnzimmer" fragt mich RHASSPY:

{"text": "Es kommen mehrere Geräte in Frage, bitte wähle zwischen heizung oder temperatur", "siteId": "wohnzimmer", "lang": null, "id": "a60147f4-f306-478f-86ad-1aea2d5cd6b5", "sessionId": "wohnzimmer-porcupine_raspberry-pi-bf42a432-1d59-4bfd-80f9-cca98b9de2b6", "volume": null}

Will ich zwar nicht die Frage, bekomm sie aber auch nicht weg.
Meine Anwort "temperatur" liefert dann aber:

{"text": "färbe temperatur rot", "likelihood": 0.46558900000000003, "seconds": 3.9034894359938335, "siteId": "wohnzimmer", "sessionId": "wohnzimmer-porcupine_raspberry-pi-bf42a432-1d59-4bfd-80f9-cca98b9de2b6", "wakewordId": null, "asrTokens": [[{"value": "färbe", "confidence": 0.994153, "rangeStart": 0, "rangeEnd": 6, "time": {"start": 0.0104221, "end": 2.96268}}, {"value": "temperatur", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 17, "time": {"start": 2.96268, "end": 3.55}}, {"value": "rot", "confidence": 0.477236, "rangeStart": 17, "rangeEnd": 21, "time": {"start": 3.55011, "end": 4.14}}]], "lang": null}

und das ganze bricht mit einem IntentNotRecognized ab. Lange danach kommt dann: "Tut mir leid, da hat etwas zu lange gedauert."

Mir scheint, RHASSPY will da einen Intent zur Fragebeantwortung. Gibt's natürlich nicht.

Frage 1: Hast du eine Ahnung, was da bei mir falsch eingestellt ist?
Frage 2: Wie schaff ich's, dass ich die Abfrage, welches Gerät ich will, wegbekomme?

---EDIT---
Ad 2: Hihi, mit getState  ;D. Aber das kann nicht die Lösung sein

Beta-User

#1257
Hmm, also:

"wie ist die wunschtemperatur vom heizkörper südwest" liefert mir was anderes wie "wie ist die temperatur vom heizkörper südwest"
Intent dazu sieht so aus:
[de.fhem:GetNumeric]
query=<de.fhem:GetDate.query>
\[<query>] [wie [ist [die]]] ((Solltemperatur | Wunschtemperatur | Zieltemperatur){Type:desired-temp} | ( warm | kalt | heiß | Temperatur ){Type:temperature}) [ist es | von | vom | ist ] (<de.fhem:SetOnOff.rooms> | [das] ($de.fhem.Device-thermostat | $de.fhem.Device-thermometer ){Device})


Der "Trick" ist: Es gibt beide Temperaturen im _Clima-Channel, beide Abfragen gehen also an dasselbe Device, aber auf ein anderes Reading.

Andere Variante: "eigentlich" verbirgt sich hinter der Solltemperatur nur ein externer (BT-) Sensor, dessen Wert dann als virtueller peer in _Climate landet (da kommt die Antwort aber auch tatsächlich her, wenn man so konkret fragt). Die "normale Abfrage" "wie warm ist es (im wohnzimmer)" landet via priority-Setting (rhasspySpecials) auf diesem Gerät,  die Soll-Temperatur käme dann von einem anderen (mit dem o.g. geteamten) RT-DN:

Raumfuehler_Wohnzimmer => priority:inRoom=temperature
Thermostat_Wohnzimmer_SSO_Clima =>  priority:inRoom=desired-temp


Ach so: Sowohl die Thermostate wie der BT-Sensor haben keine explizit gesetzten rhasspyMappings, das kommt aus gDT "thermostat" bzw. "thermometer".

Nachtrag noch:
Vergleichbares für einen Wandthermostaten (_Climate-Channel):Thermostat_EssZi_Climate => priority:inRoom=desired-temp,temperature,humidity
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

Danke. rhasspySpecials war die Lösung! Hatte ich probiert, wusste aber nicht, wie man das richtig verwendet.

JensS

Wo kann man sich beim RHASSPY (B.A.) einschreiben?  8)
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.