FHEM und Rhasspy

Begonnen von drhirn, 28 Juli 2020, 14:28:50

Vorheriges Thema - Nächstes Thema

bennebartsch

#15
Es geht nicht wirklich um die rhasspyName Attribute, sondern ehr ums Prinzip. Bei Shortcuts z.B. wäre es sehr hilfreich wenn ich nicht jedes Shortcut 5x kopieren muss sondern einfach den Rhasspy Syntax benutzen kann.
BTW: Shortcuts laufen bei mir mit deiner Version einwandfrei! Einziges Problem sind immer noch Umlaute


(einen kaffee | mach[e] mal kaffee) [bitte]={fhem "set jura cmd 1coffee";}

drhirn

Ah, verstehe, was du meinst. Gut, das ging unter Snips ja auch schon nicht. Lässt sich sicher so einbauen (bei den Shortcuts). Mir fehlt nur leider gerade Zeit und Wissen.

bennebartsch

Ich kümmere mich jetzt erstmal um das Problem mit den Umlauten. Es sieht so aus als würde Rhasspy die Umlaute anders ins MQTT schicken als Snips. Werde ich mir heute Abend nochmal genauer anschauen.
Danach widme ich mich dem Rhasspy Syntax für Shortcuts.

Custom Intents laufen allerdings auch wunderbar!
rhasspyChannels muss ich noch testen.

drhirn

Ich hab hier noch eine andere Version. An der hab ich in letzter Zeit am meisten gemacht: https://github.com/drhirn/fhem-rhasspy/blob/master/10_STE.pm
Da funktioniert auch der "say"-Befehl (jetzt "speak").

Mir ist aber aufgefallen, dass SetNumeric Intents nicht funktionieren.

bennebartsch

#19
Bei mir läuft SetNumeric mit deiner 10_RHASSPY wunderbar.
So sieht meine config grade aus:

[global]
artikel = [( der | die | das | den )]
end = [( kollege  | mein freund )]
SetStart = [ [ schalt[e] | stell[e] | mach[e] ] [<artikel>] ]
DeviceRoom = ($de.fhem.Device){Device} [im] [($de.fhem.Room){Room}]

[de.fhem:SetOnOff]
<global.SetStart> <global.DeviceRoom> $OnOffValue{Value} <global.end>

[de.fhem:GetNumeric]
(auf wieviel [prozent] steht | auf was steht)  [<global.artikel>] <global.DeviceRoom> <global.end>

[de.fhem:GetStatus]
(status | wie ist der status von) [<global.artikel>] <global.DeviceRoom> <global.end>

[de.fhem:SetNumeric]
<global.SetStart> <global.DeviceRoom> [auf] (0..100 | dunkel:10 | hell:100 | heller:100 | dunkler:10){Value} [Prozent] <global.end>

[de.fhem:Shortcut]
($de.fhem.Shortcuts){Shortcut} <global.end>

[de.fhem:home_status]
away = (ich bin dann mal weg | hau rein | bis später):away
home = (ich bin wieder da | boss is back):home
bed = (ich gehe jetzt ins bett | gute nacht):bed
sleep = (schlaf gut | bis morgen):sleep
(<away> | <home> | <bed> | <sleep>){status} <global.end>

chicco

Hallo zusammen,

ich kann zu Rhasspy eigentlich nix beitragen, denn ich habe es bisher nicht installiert.
Mein Snips funzt einfach zu gut, da gabs bisher keinen Bedarf Rhasspy zu benutzen.
Aber ich habe irgendwann mal die Rhasspy-Doku überflogen und bin hier am mitlesen - vielleicht braucht man es dann doch irgendwann...

Für die Shortcuts habe ich vielleicht was für euch:
Ich hatte Anfang des Jahres einen Shortcut-Generator für Snips gebaut, siehe hier:
https://forum.fhem.de/index.php/topic,89548.msg1016099.html#msg1016099
Siehe auch die Beiträge #931 und #939
Da werden im Attribut "myShortcuts" shortcuts in variabler Form hinterlegt. Dann führt man ein "set Snips generateShortcuts" aus und dann hat man einen Haufen generierter Shortcuts im Attribut "shortcuts". Bei der Syntax für den Generator hatte ich mich übrigens an der Rhasspy-Syntax orientiert, nur die eckigen Klammern haben eine andere Bedeutung.
Bin mir nicht sicher ob es das ist was ihr sucht. Falls ja, könnt ihr euch ja daran orientieren oder Code kopieren.

Gruß
chicco

bennebartsch

Hey chicco, coole Idee! Allerdings würde ich das nicht in Kombination mit Rhasspy nutzen, da Rhasspy das alles schon wunderbar selber kann.

Bezüglich der Umlaute: Der Fehler liegt (wie vermutet) bei Rhasspy. Habe auf Github ein Issue eröffnet, die Lösung kam auch recht flott als Antwort.
https://github.com/rhasspy/rhasspy/issues/111

laberlaib

Hallo,
so, Sonntag, Kinder vor der Glotze...
Rhasspy installiert, auf deutsch und auch den dort internen MQTT-Server erreichbar gemacht.
docker run -d -p 12101:12101 \
      -p 12183:12183 \
      --name rhasspyDE \
      --restart unless-stopped \
      -v "$HOME/.config/rhasspy/profiles:/profiles" \
      -v "/etc/localtime:/etc/localtime:ro" \
      --device /dev/snd:/dev/snd \
      rhasspy/rhasspy \
      --user-profiles /profiles \
      --profile de

gemäß Anleitung bei Rhasspy
Dann wie bei Snips ein MQTT-Device in FHEM angelegt:
defmod mqtt_RHAPSSY_DE MQTT 192.168.178.20:12183
attr mqtt_RHAPSSY_DE group Technik
attr mqtt_RHAPSSY_DE room Rhapssy

10_RHASSPY von hier runtergeladen, auf den FHEM-Server kopiert, Reload 10_RHASSPY gemacht und Device angelegt:
defmod rhasspy_DE RHASSPY mqtt_RHAPSSY_DE Wohnzimmer
attr rhasspy_DE IODev mqtt_RHAPSSY_DE
attr rhasspy_DE room Rhapssy


Ohne jede weitere Optimierung: Welche Services brauch ich den jetzt, damit fhem das alles mitbekommt?
Mit den angehängten Einstellungen bekomme ich nur
Readings
transmission-state     incoming publish received     2020-09-20 14:09:43

Mein Uraltes Snips-Device hat ja viel mehr bekomen:
Readings    lastIntentPayload    {"Device":"vitrinenlicht","Value":"aus","input":"vitrinenlicht aus","intent":"SetOnOff","probability":null,"requestType":"voice","sessionId":"97899adb-49aa-474f-9edd-3e46d26828c9","siteId":"default"}    2019-03-22 16:31:56
lastIntentTopic    hermes/nlu/intentParsed    2019-03-22 16:31:56
u.v.m
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

drhirn

Zitat von: laberlaib am 20 September 2020, 14:18:27
Ohne jede weitere Optimierung: Welche Services brauch ich den jetzt, damit fhem das alles mitbekommt?

Wie sehen deine Rhasspy-Sentences aus? Leg einen an, der [de.fhem:SetOnOff] heißt und dann sollte alles funktionieren.

drhirn

Wärt ihr so nett und würdet mal diese Version hier auf Herz und Nieren testen. An der 10_RHASSPY.pm mache ich nichts mehr.
https://github.com/drhirn/fhem-rhasspy/blob/master/10_STE.pm

Dafür müsste man halt ein eventuelles Rhasspy-Device löschen.

Wie weiter oben schon erwähnt, funktioniert hier der "say"-Befehl (heißt jetzt "speak"). Es gibt auch noch ein paar zusätzliche Intents (GetTime, GetWeekday). Und ich habe da v.a. etwas aufgeräumt. Auch wenn's noch immer ein ziemlicher Saustall ist.

laberlaib

#25
...aber alles andere bleibt bei RHASSPY? room, mapping, etc?
Warum die Umbenennung?

€: Und wenn ich Slots, Values und so Anpassen muss, dann ist ja auch nur zum testen, ob die Verbindngen funktionieren doch etwas mehr notwendig...
Eigentlich könnte man dann doch so "generische" Slots, Sentence etc. als eine Art "Bibliotheken" auch sammeln? Weil bei Snips waren ja nur die Values dann individuell so weit ich mich erinnere.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

drhirn

Ja, alles andere bleibt. Ich hab's nur vorläufig umbenannt, damit ich bei einem Fehler mit der alten Version vergleichen kann.

Die Sache mit dem Sentences, Slots, etc. sammeln ist eine gute Idee! Die sollten ja bei uns allen gleich sein. Werde morgen mal posten, was ich so habe. Ist noch nicht viel, weil ich der Sache noch nicht viel Zeit gewidmet habe.

laberlaib

#27
Slot sind Casesensitive
device != Device
value != Value


Also ich hab eben das STE-Modul installiert und dann ohne "train" mal einen einfachen Versuch gestartet:
Sentence.ini:

[de.fhem:SetOnOff]
Stehlampe{device} im Wohnzimmer{room} an{value}


Das soll folgendes Device schalten:
defmod light_Stehlampe MQTT2_DEVICE zigbee_0xec1bbdfffe181343
attr light_Stehlampe rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off\
GetOnOff:currentValue=state,valueOff=off
attr light_Stehlampe rhasspyName Stehlampe
attr light_Stehlampe rhasspyRoom Wohnzimmer
attr light_Stehlampe room Rhasspy,LIGHTER,MQTT2_DEVICE,Snips

Den Satz eingegeben und der intent wird an FHEM/STE weitgergeben. Ausgeführt wird allerdings nix. Mit verbose 5 ergibt das:

2020.09.25 12:27:17 5: publish received for hermes/intent/de.fhem:SetOnOff, {"input": "Stehlampe im Wohnzimmer an", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "default", "id": "8bf710a1-7fb7-4e57-9eab-ae1646e0678f", "slots": [{"entity": "device", "value": {"kind": "Unknown", "value": "Stehlampe"}, "slotName": "device", "rawValue": "Stehlampe", "confidence": 1.0, "range": {"start": 0, "end": 9, "rawStart": 0, "rawEnd": 9}}, {"entity": "room", "value": {"kind": "Unknown", "value": "Wohnzimmer"}, "slotName": "room", "rawValue": "Wohnzimmer", "confidence": 1.0, "range": {"start": 13, "end": 23, "rawStart": 13, "rawEnd": 23}}, {"entity": "value", "value": {"kind": "Unknown", "value": "an"}, "slotName": "value", "rawValue": "an", "confidence": 1.0, "range": {"start": 24, "end": 26, "rawStart": 24, "rawEnd": 26}}], "sessionId": "8bf710a1-7fb7-4e57-9eab-ae1646e0678f", "customData": null, "asrTokens": [[{"value": "Stehlampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 9, "time": null}, {"value": "im", "confidence": 1.0, "rangeStart": 10, "rangeEnd": 12, "time": null}, {"value": "Wohnzimmer", "confidence": 1.0, "rangeStart": 13, "rangeEnd": 23, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 24, "rangeEnd": 26, "time": null}]], "asrConfidence": null, "rawInput": "Stehlampe im Wohnzimmer an", "wakewordId": null, "lang": null}
2020.09.25 12:27:17 5: Parsed value: 8bf710a1-7fb7-4e57-9eab-ae1646e0678f for key: sessionId
2020.09.25 12:27:17 5: Parsed value: 1 for key: probability
2020.09.25 12:27:17 5: Parsed value: Stehlampe im Wohnzimmer an for key: rawInput
2020.09.25 12:27:17 5: Parsed value: default for key: siteId
2020.09.25 12:27:17 5: Parsed value: Stehlampe for key: device
2020.09.25 12:27:17 5: Parsed value: SetOnOff for key: intent
2020.09.25 12:27:17 5: Parsed value: an for key: value
2020.09.25 12:27:17 5: Parsed value: Wohnzimmer for key: room
2020.09.25 12:27:17 5: Parsed value: Stehlampe im Wohnzimmer an for key: input
2020.09.25 12:27:17 5: handleIntentSetOnOff called

Und dann passiert nix.
Bescheidene Perl-Kenntnisse: Ich hab mal da hinter
1099 if (exists($data->{'Device'}) && exists($data->{'Value'})) {
Noch ein Log3 eingefügt, welches aber nie ausgegeben wird. D.h. das wird wohl nie true...

Ich bin mal was WE fort, drum kann ich erst Sonntagabend/Montag weiterforschen.

dann müsste doch das hier
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

drhirn

Ah, jetzt wollte ich mir gerade deinen Beitrag vornehmen, weil ich endlich Zeit habe. Hat mich doch sehr gewundert, weil das alles richtig ausgesehen hat. Aber siehe da, ist eh schon gelöst :).

laberlaib

#29
Dann hab ich was anderes zum Vornehmen:
Mehrsprachigkeit!
Das wäre ein Killerfeature und wohl sowas wie ein USP!

- Den Rhasspymaster kann ich ja in beliebigen VMs mehrfach laufen lassen, kein Ding.
- In FHEM mehrer MQTT-Connectoren und Rhasspymaster anlegen sollte auch funktionieren.
- Rhasspy-Satelliten auf 2 verschiedene Hotwords trainieren, die dann nur den jeweiligen Master aktvieren und Audio an diesen weitergeben, lässt sich evtl. mit MQTT darstellen (sonst eben zunächst mal zwei Satelliten)

- Aber zum Trainieren und v.a. zum Matchen werden in FHEM eben immer die gleichen Attribute genutzt. D.h. ich würde dem Deutschen Rhasspy auch die Spanischen Begriffe beibringen wollen - das wird das Sprachmodel nicht mitmachen/hart verwirren.

Also mein Vorschlag mehr oder weniger ins Blaue rein: Man kann dem Modul im define neben dem Standardraum und dem MQQT-Device noch ein Postfix mitgeben, welches dann an die Attributnamen angehängt wird.
define rhasspyDeutsch STE Wohnzimmer mqttConnectorDeviceZumDeutschenMaster DE
und
define rhasspySpanisch STE Salon mqttConnectorDeviceZumSpansichenMaster ES

und die attribute werden dann eben
attr rhasspyDeutsch rhasspyRoomDE
attr rhasspyDeutsch rhasspyNameDE

bzw.
attr rhasspySpanisch rhasspyRoomES
attr rhasspySpanisch rhasspyNameES


Default für das Postfix ist leer, so dass bestehende Installationen nichts angepasst werden müssen.

Positiver Mehrwert: man kann bei der Sprachausgabe drauf zurückgreifen: Ich lasse bspw. ansagen, wenn ich die Haustür öffne und ein Fenster offen ist. Da kann ich dann viel einfacher die Bezeichnungen der Fenster rauspflücken, wenn ich unterschiedliche Namensfelder für unterschiedliche Sprachen habe.

(Ich könnte sicherlich auch alles einfach einmal in FHEM und nochmal in den Rhasspyinstallationen pflegen. Aber das Ziel wäre ja, dass man nur eine Stelle hat, wo das zu tun ist und der Rest sozusagen generisch ist, so wie bei Snips es war. Und generische Sentence.ini werden gemeinsam erarbeitet).

€: Das STE-Device bekommt natürlich das FHEM-MQTT-Connector-Device als Attribut, nicht direkt die Rhasspy-IP.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)