FHEM und Rhasspy

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

Vorheriges Thema - Nächstes Thema

davedeluxe

Danke das ist schon sehr hilfreich.
Ist es auch möglich mit einem internen MQTT? ICh wollte eigentlich keinen separaten mosqitto aufsetzen wenn möglich.

JensS

#151
Ohne Mosquitto geht's nicht. Bei der Rhasspy-Installation wird Mosquitto mit installiert und ofensichtlich für den internen MQTT genutzt.
Falls du bereits einen Mosquitto für andere Dinge nutzt, könntest du vielleicht eine zweite Instanz mit einem anderen Port starten.
Bei mir habe ich es so gehandhabt, dass mein Basis einen Mosquitto für Rhasspy hat und FHEM auf einem anderen Server läuft.
Du könntest auch MQTT2Server für Port 1883 nehmen und Mosquitto auf Port 1884 lauschen lassen. Es gibt der Wege viele...
Gruß Jens
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

Natürlich. Du musst dann nur am Master den Port freigeben. Steht alles in der Rhasspy Dokumentation.

davedeluxe

Ich komme leider nicht weiter...
vielleicht kann sich mal jemand meine Config ansehen.

Also der master (192.168.66.51) läuft auf einem NUC ohne Audio Aus- oder Eingabe.
Der satellit-dach (192.168.66.240) läuft auf einem RPi 3 mit einem respeak2 und soll für die Audio Aus- und Eingabe zuständig sein.

FHEM ist mit dem master verbunden und führt auch Befehle aus die ich per Text- oder Spracheingabe am satellite-dach bzw. per Text am master eingebe.
Was ich absolut nicht zum Laufen kriege ist, das ich eine Sprachausgabe am satellite-dach bekomme.

Audio ansich funktioniert, ich bekomme nach Angabe des Hotword die "beeps" zu hören und auch wenn ich einen Text bei TTS eingebe bekomme ich diesen über die Lautsprecher am satellite-dach ausgegeben.

Anbei zwei Screenshots meiner Settings.

Vielen Dank schonmal!

JensS

master passt
satellite-dach:
Audio Recording - host: 127.0.0.1 port: 12202
Dialog Management - Satellite siteIds: satellite-dach

Gruß Jens
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.

davedeluxe

DANKE!
Endlich! Es spricht ;)

cb2sela

Guten Morgen,

kann mir jemand mit SetColor helfen? Ich habe erfolgreich alles Andere hinbekommen, aber die Farbtemperatur kriege ich nicht mittels SetColor hin.

Ich habe gemäß der Thyraz-Doku:
attr HUEDevice1 userattr rhasspyColors:textField-long

Dann das attribut rhasspyColors befüllt:
warm=ct 445
neutral=ct 300
kalt=ct 250


Meine IKEA-Tradfri hat folgendes rhasspyMapping:
SetOnOff:cmdOn=on,cmdOff=off
SetNumeric:currentVal=pct,cmd=pct,minVal=5,maxVal=100,step=10,type=Helligkeit
SetColor:currentVal=ct,cmd=ct


und in Rhasspy habe ich:
[de.fhem:SetColor]
(wohnzimmerlampe){Device} [Farbe] [auf] (warm|neutral|kalt){Value}


Ein funktionierendes "wohnzimmerlampe auf 15 Prozent" liefert:
2021-01-31 10:24:50 RHASSPY Rhasspy transmission-state: incoming publish received
2021-01-31 10:24:50 RHASSPY Rhasspy listening_wohnzimmer: 1
2021-01-31 10:24:57 RHASSPY Rhasspy transmission-state: incoming publish received
2021-01-31 10:24:57 RHASSPY Rhasspy lastIntentTopic: hermes/intent/de.fhem:SetNumeric
2021-01-31 10:24:57 RHASSPY Rhasspy lastIntentPayload: {"Device":"wohnzimmerlampe","Value":15,"input":"wohnzimmerlampe auf 15 Prozent","intent":"SetNumeric","probability":1,"rawInput":"wohnzimmerlampe auf fünfzehn prozent","requestType":"voice","sessionId":"default-bumblebee_raspberry-pi-79378dc8-a536-4e0a-a329-4d1c2e7f7cdd","siteId":"default"}
2021-01-31 10:24:57 RHASSPY Rhasspy voiceResponse: Mache ich doch sehr gerne
2021-01-31 10:24:57 RHASSPY Rhasspy responseType: voice
2021-01-31 10:24:58 HUEDevice HUEDevice1 reachable: 1
2021-01-31 10:24:58 HUEDevice HUEDevice1 lastseen: 2021-01-31T09:24Z
2021-01-31 10:24:59 RHASSPY Rhasspy transmission-state: incoming publish received
2021-01-31 10:24:59 RHASSPY Rhasspy listening_wohnzimmer: 0


Ein nicht funktionierendes "wohnzimmerlampe farbe auf kalt" liefert:
2021-01-31 10:25:32 RHASSPY Rhasspy transmission-state: incoming publish received
2021-01-31 10:25:32 RHASSPY Rhasspy listening_wohnzimmer: 1
2021-01-31 10:25:37 RHASSPY Rhasspy transmission-state: incoming publish received
2021-01-31 10:25:37 RHASSPY Rhasspy lastIntentTopic: hermes/intent/de.fhem:SetColor
2021-01-31 10:25:37 RHASSPY Rhasspy lastIntentPayload: {"Device":"wohnzimmerlampe","Value":"kalt","input":"wohnzimmerlampe Farbe auf kalt","intent":"SetColor","probability":1,"rawInput":"wohnzimmerlampe farbe auf kalt","requestType":"voice","sessionId":"default-bumblebee_raspberry-pi-1fb909dc-6242-4a5a-8274-9401092e41e1","siteId":"default"}
2021-01-31 10:25:37 RHASSPY Rhasspy voiceResponse: Da ist leider etwas schief gegangen.
2021-01-31 10:25:37 RHASSPY Rhasspy responseType: voice
2021-01-31 10:25:40 RHASSPY Rhasspy transmission-state: incoming publish received
2021-01-31 10:25:40 RHASSPY Rhasspy listening_wohnzimmer: 0


Vielen Dank vorab.

drhirn

#157
edit: Unten stehendes ist falsch.

----------
Ich bin mir nicht sicher, aber kannst du's mal so versuchen:


warm=445
neutral=300
kalt=250

JensS

#158
Bei mir funktioniert:

rhasspyColors:weiß=color_temp 250
normal=color_temp 400
gemütlich=color_temp 500
"color_temp" kann bei dir anders heißen. Schau einfach, welcher set-Befehl für den Farbwert zuständig ist (z.B. "normal=color FCFF99"). Anschließend "set Rhasspy updateSlots" nicht vergessen.

sentences.ini:[de.fhem:SetColor]
stelle [(die|den|das)] ($de.fhem.Device){Device}  [($de.fhem.Room){Room}] ($de.fhem.Color){Color}
zwingend erforderlich: "($de.fhem.Device){Device}" und "($de.fhem.Color){Color}"

rhasspyMapping:SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}
GetOnOff:currentVal=state,valueOff=off
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,step=15,map=percent,type=Helligkeit
GetNumeric:currentVal=brightness,minVal=0,maxVal=255,map=percent,type=Helligkeit
"SetColor" taucht hier nicht auf.
Gruß Jens
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

Nimm das SetColor aus dem Mapping raus. Brauchst du nicht.

cb2sela

Danke Euch.
Zunächst musste ich in Rhasspy Value durch Color ersetzen, um überhaupt eine positive Reaktion zu bekommen:
[de.fhem:SetColor]
(wohnzimmerlampe){Device} [Farbe] [auf] (warm|neutral|kalt){Color}


RhasspyColors hat das ct durchaus gebraucht, also
warm=ct 445
neutral=ct 300
kalt=ct 250

weil ein Schalten ja auch per set HUEDevice1 ct 300 ging.

Was ich nicht verstehe: Warum geht es auch ohne SetColor im RhasspyMapping? Es geht sowohl ohne als auch mit SetColor?

JensS

#161
Das steht so im Modul. Mit "ct 300" weiß Rhasspy ja bereits, was zu mappen ist.

Übrigens...
In der sentences.ini sollten keine Device- oder Raumnamen stehen. Diese werden von FHEM mit updateSlots übergeben und befinden sich dann in den Slotdateien de.fhem.Device und de.fhem.Room.
Das Gleiche gilt auch für Sendernamen, Farben und NumericTypen.

Die Werte stehen dann in den Slotdateien des Rhasspy-Masters und man greift über Variablen auf die Daten zu.
z.B. "($de.fhem.Device){Device}" und "($de.fhem.Color){Color}"

(wohnzimmerlampe) und (warm|neutral|kalt) sollten durch ($de.fhem.Device){Device} und ($de.fhem.Color){Color} erstezt werden.

Gruß Jens

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.

Roman

Hallo,

kennt jemand eine Möglichkeit die sentences mit 'Wildcards' auszustatten ?
Ich bastel gerade an einem Timer, was soweit schon ganz gut klappt. Mehrere Timer unterscheide ich aktuell durch anhängen eines timestamps.
Um mehrere Timer auch zu unterscheiden wäre auch ein Name des Timers super, auch zur Abfrage zur verbleibenden Laufzeit usw.
also ungefähr so was:
[de.fhem:RhasspySetTimer]
\[(stell | stelle)] [mir][(den|einen|meinen)] [a-z {Name}] Taimer {Device} [(auf|für|mir)] [(1..24){hour} (Stunde|Stunden)] [und] [(0..60) {min} (minute|minuten)] [und] [(0..60){sec} (sekunde|sekunden)]

Wobei Name irgendwas sein kann. In der Rhasspy Doku hab ich hierzu nichts gefunden, Nur sowas wie Alternativnamen, Ersetzungen von erkannten Worten.

Erkannt werden die Wörter aber. (auch wenn ich die nicht trainiert habe)
Im 'lastIntentPayload'  findet sich dann sowas
rawInput":"stelle den kartoffel taimer auf 10 Minuten"

Ich hab nur keine Idee wie ich die im Intent dann der Variablen 'Name' zuordnen kann.
Ich könnte jetzt zwar alle möglichen Wörter die  mir einfallen (Kuchen, Braten, Eier, Waschmaschine, Fenster zu machen usw.) in einen Slot packen und immer erweitern wenn was neues dazukommt, aber eine flexible Lösung wäre mit lieber.

Gruß
Roman



JensS

#163
Hallo Roman,

das sieht sehr interessant aus. Kannst du mal bitte deine profile.json posten? Nutzt du den "Open transcription mode"?
Auf jeden Fall kannst du den rawInput im Reading lastIntentPayload auswerten. Hier mal ein (Bei)Spielscript.

rhasspyIntents hinzufügen:Wikipedia=Wikipedia(Begriff)

sentences.ini:[de.fhem:Wikipedia]
erkläre mir was (Lampe | Fenster | Fahrrad){Begriff} ist


99_myUtils:
use Data::Dumper;
use JSON;
use LWP::UserAgent;

sub Wikipedia($){
my ($Input) = @_;
my $lastIntentPayload = $defs{Rhasspy}->{READINGS}{lastIntentPayload}{VAL};
my ($Begriff) = $lastIntentPayload =~ /rawInput\"\:\"erkl\äre\ mir\ was (.*?)(?= ist)/;
$Begriff =~ s/ /_/g;
$Begriff =~ s/ä/%C3%A4/g;
$Begriff =~ s/ö/%C3%B6/g;
$Begriff =~ s/ü/%C3%BC/g;
$Begriff =~ s/ß/%E1%BA%9E/g;
my $ua = LWP::UserAgent->new();
my $response = $ua->get("https://de.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=$Begriff");
my $content = $response->content;
my $ref = JSON->new->decode($content);
my ($jsonHash) = values %{ $ref->{'query'}->{'pages'} };
my $Response = $jsonHash->{'extract'};
$Response =~ s/\(/ /g;
$Response =~ s/\)/ /g;
$Response =~ s/\;/ /g;
$Response =~ s/\'/ /g;
$Response =~ s/\./ - /g;
$Response =~ s/\:/ /g;
$Response =~ s/\,/ /g;
$Response =~ s/\'/ /g;
$Response = lc $Response;
$Response = encode('utf-8',$Response);
return $Response;
}


Mit "Alexa, erkläre mit was Lampe ist" sollte eine zusammenfassende Erklärung zu hören sein

Gruß Jens
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.

davedeluxe

Zitat von: JensS am 14 Januar 2021, 21:54:05
@drhirn

Anbei meine LED-Steuerung. Ist quick $ dirty...
Nach dem Wakeword wird die mittlere LED grün und anschließend bis zum Ende des Prozesses blau. Anschließend erlischt die LED wieder.
Man kann die Funktion durch einen kurzen Tastendruck auf den Button (de)aktivieren.
Drückt man 3 Sekunden, wird das Mikro aus- bzw. angeschaltet.
Hält man den Button 10 Sekunden gedrückt, leuchtet die LED für 2 Sekunden rot und der RPI wird heruntergefahren. Nach ca. 30 Sekunden kann man ihn dann vom Strom trennen.
Meine Programmierkenntnisse sind eher dürftig, so dass ich dich bitte, dir das Ganze mal anzuschauen und zu testen.

Gruß Jens

p.s. Die Abfrage bnutzt paho-mqtt, welches ich mitapt-get install python3-paho-mqttinstalliert habe.
p.p.s. LED.py ist neu.
p.p.p.s. Liegt jetzt hier: https://github.com/jens-schiffke/Rhasspy-LED

Funktioniert das auch mit dem Respeaker 4-Mic Hat?