FHEM und Rhasspy

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

Vorheriges Thema - Nächstes Thema

Roman

Hi Jens,
ich hab mir dazu in der Rhasspy-Webgui einen neuen Slot angelegt und mit meinen Timernamen befüllt

JensS

#181
@drhirn
In deinem Testing-Branch gibt es eine neue Routine zur Übertragung von Wav-Dateien. Funktioniert das und ist das schon reif für den Master-Brunch?
Gruß Jens

@Roman
Klasse - funktioniert hervorragend! Die Set-Sub habe ich für mich etwas umgeschrieben, um eine Sprachmeldung des Satelliten zu erhalten: sub RhasspySetTimer($) {
my $response="OK";
my $timestamp=time();
  # Übergebene Parameter in Variablen speichern
  my ($Device,$hour,$min,$sec,$Name) = @_;
$hour=0 if !defined ($hour);
$min=0 if !defined ($min);
$sec=0 if !defined ($sec);
$Name="default" if !defined ($Name);
my $lastIntentPayload = $defs{Rhasspy}->{READINGS}{lastIntentPayload}{VAL};
my ($SiteId) = $lastIntentPayload =~ /siteId\"\:\"(.*?)(?=\")/;
  # Standardantwort festlegen
  if ( $hour == 0 && $min == 0 && $sec == 0) {
  $response = " ";
  } else {
  my $duration_export = strftime('%H:%M:%S', $sec, $min, $hour, 1, 1, 1900);
  my $duration = $hour.".".$min.".".$sec;
my $timer = "RhasspyTimer_$Name"."_"."$duration";
  fhem("define $timer at +$duration_export set Rhasspy speak siteId=\"$SiteId\" text=\"Achtung - der $Name Taimer ist abgelaufen\"");
  $response="$Name Taimer wurde gestellt";
};
  return $response;
};

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

Zitat von: Roman am 07 Februar 2021, 19:37:12
ich hab mir für Rhasspy einen Timer gebastelt. Wer ihn mal testen/ausprobieren möchte die Konfig dazu.

Ich hatte doch eh schon einen Timer ins Modul eingebaut.

drhirn

Zitat von: JensS am 07 Februar 2021, 20:49:41
@drhirn
In deinem Testing-Branch gibt es eine neue Routine zur Übertragung von Wav-Dateien. Funktioniert das und ist das schon reif für den Master-Brunch?

Nein. Leider nicht. Ich habe nicht raus bekommen, wie ich die WAV Dateien so kodiere, dass sie richtig am MQTT Server ankommen. Und dann hat mich ein anderes Projekt von Rhasspy abgelenkt ;)

JensS

#184
Heureka - ist gaaanz einfach, wenn man's findet.
Die Datei werner1_Flasche.wav nach /opt/fhem/cache kopieren. Besitz anpassen mit "chown fhem /opt/fhem/cache/werner1_Flasche.wav", Code in 99_myUtils.pm kopieren, den Rhasspy-Devicenamen "$defs{Rhasspy}" sowie die MQTT-Sevrer-IP anpassen und "stelle einen Timer auf 10 Sekunden" sagen.  8)
# SetTimer Custom Intent
sub RhasspySetTimer($$$$$) {
my $response="OK";
my $timestamp=time();
  # Übergebene Parameter in Variablen speichern
  my ($Device,$hour,$min,$sec,$Name) = @_;
$hour=0 if !defined ($hour);
$min=0 if !defined ($min);
$sec=0 if !defined ($sec);
my ($lastIntentPayload) = $defs{Rhasspy}->{READINGS}{lastIntentPayload}{VAL};
my $ref = JSON->new->decode($lastIntentPayload);
my $SiteId = encode('utf-8',encode('cp-1252',$ref->{'siteId'}));
$Name = encode('utf-8',encode('cp-1252',$ref->{'Name'}));
$Name="Standard" if !defined ($Name);
my $atName = $Name;
$atName =~ s/ä/ae/g;
$atName =~ s/ö/oe/g;
$atName =~ s/ß/ss/g;
$atName =~ s/ü/ue/g;
  # Standardantwort festlegen
  if ( $hour == 0 && $min == 0 && $sec == 0) {
  $response = " ";
  } else {
  my $duration_export = strftime('%H:%M:%S', $sec, $min, $hour, 1, 1, 1900);
  my $duration = $hour.".".$min.".".$sec;
my $timer = "RhasspyTimer_$atName"."_"."$duration";
fhem("define $timer at +$duration_export { qx(/usr/bin/mosquitto_pub -h 192.168.100.1 -t \'hermes/audioServer/$SiteId/playBytes/$timestamp\' -f /opt/fhem/cache/werner1_Flasche.wav);;fhem(\'set Rhasspy speak siteId=\"$SiteId\" text=\"Achtung - der $Name Taimer ist abgelaufen\"\')}");
$response="$Name Taimer wurde gestellt";
};
  return $response;
};


Gruß Jens

p.s. Umlaute im Topic und im Timernamen werden nun auch übergeben
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

Hat jemand eine Möglichkeit parat wie man folgendes integrieren kann:

Bring! (Einkaufsliste)
Wikipedia fragen
Google fragen
Wolfram nutzen für z.B. Rechenaufgaben während man kocht (was sind 2/3 von 586g)
Wie ist das Wetter, brauch ich nen Schirm?

Das fehlt mir noch...

drhirn

Zitat von: JensS am 08 Februar 2021, 19:47:55
Heureka - ist gaaanz einfach, wenn man's findet.

Und wo hast du 8ewnjksdf093jb42 her?

JensS

#187
Zitat von: drhirn am 09 Februar 2021, 13:13:35
Und wo hast du 8ewnjksdf093jb42 her?
Das ist eine Session-ID (d|m)einer Wahl. Guck mal hier: https://docs.snips.ai/reference/hermes
Hab den Code nochmal überarbeitet und u.a.  Umlaute mit reingenommen, da ich in der Küche keinen Brötchen-Timer stellen konnte.
Nun bin ich auf der Suche nach einer Antwort auf die Frage, wie man den Namen des Devices rausbekommt, welches die sub aufruft.$defs{Rhasspy} bezieht sich auf mein RHASSPY-Device, welches zufällig Rhasspy heißt.
Jemand einen Tipp?

@davedeluxe
1. Solltest Du genauer erläutern...
2.+3. Geht nicht direkt aus Rhasspy ohne "Open transcription mode". Das ist noch fernes Land für mich.
4. Kopfrechnen ist eine Stärke von Rhasspy. Solch ein Intent benötigt wenig Code.
5. Ist möglich. Dazu hatte ich einen rudimentären Intent in diesem Thread erstellt. Müsste halt nur erweitert 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.

davedeluxe

Zitat@davedeluxe
1. Solltest Du genauer erläutern...
2.+3. Geht nicht direkt aus Rhasspy ohne "Open transcription mode". Das ist noch fernes Land für mich.
4. Kopfrechnen ist eine Stärke von Rhasspy. Solch ein Intent benötigt wenig Code.
5. Ist möglich. Dazu hatte ich einen rudimentären Intent in diesem Thread erstellt. Müsste halt nur erweitert werden.

Gruß Jens

1. Also ich würde gerne Bring! in FHEM einbinden, ich glaube aber das es an der nicht vorhandenen öffentlichen API hängt - wobei es für ioBroker anscheinend ein Modul gibt...
2+3 dann warte ich, hab mich da auch schon versucht dran zu machen aber da fehlt mir das know how.
4. Wenn ich so drüber nachdenke sollte es per myutils tatsächlich kein all zu großes Problem sein. Ich versuche mich mal dran auch wenn ich wenig Ahnund davon habe ;)
5. Schaue ich mir an, danke!

JensS

@davedeluxe
Bring! war im Forum bereits Thema. Am besten wäre ein separates Bring-Modul, auf das man zugreifen kann.
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

Könnte mir jemand hier helfen?
Ich habe wirklich keine ahung von der myUtils bzw. wie ich das korekt mache aber langsam wird es, also nicht zu kritisch sein :)
Ich möchte meinen Staubsauger steuern, das funktioniert auch FAST. Er Saugt die Räume die ich ihm nenne aber die unteren Befehle (Pause, Start, Stop) funktionieren nicht bzw. egal was ich davon sage, er pausiert immer.
# Sauger
sub rhasspySauger($$$) {
    # Übergebene Parameter in Variablen speichern
    my ($Artikel,$Room,$Value) = @_;

    # Standardantwort
    my $response = "Was willst du?";

if (defined $Artikel) {
fhem "set Roborock zone $Room";
        return "OK ich sauge $Artikel $Room";
}
if ( $Value = "pause") {
fhem "set Roborock pause";
return "OK Staubsauger pausiert";
}
if ( $Value = "start") {
fhem "set Roborock start";
return "OK Staubsauger startet";
}
if ( $Value = "laden") {
fhem "set Roborock charge";
return "OK Staubsauger fährt zur Ladestation";
}
return $response;
};


Ich denke das es einfach ein Problem mit der "if" Abfrage ist.

drhirn

Ich denke, du denkst viel zu kompliziert ;)

Für Start, Stop, Pause kannst du einfach einen MediaControls Intent aus dem Modul nehmen.
Und für die Zone bastelst du dir einen Custom Intent. Und das funktioniert ja schon.

davedeluxe

 ::) Darin bin ich super
Danke :)

ABER ich brauch noch einen Befehl für "geh laden", den müsste ich in der myutils unterbringen - UND ich würde gerne verstehen wo mein Fehler liegt.

drhirn

Für Laden kannst du ja "zurück" nehmen.

Zu deinem If:
- Die Anwort wird immer "Was willst du" sein, weil du nie irgendwie eine andere Antwort definierst.
- Statt den vielen Ifs solltest du lieber switch oder if/else verwenden

JensS

@davedeluxe
Was drhirn schreibt, kann ich nur unterstreichen. Hier als Hilfestellung, was deinem Code gefehlt hätte  - jeder fängt mal an:sub rhasspySauger($$$) {
    # Übergebene Parameter in Variablen speichern
    my ($Artikel,$Room,$Value) = @_;

    # Standardantwort
    my $response = "Was willst du?";

if (defined $Artikel) {
fhem "set Roborock zone $Room";
#        return "OK ich sauge $Artikel $Room";
     $response = "OK ich sauge $Artikel $Room" #In der letzten Zeile kann, muss aber kein Semikolon stehen.
}; #Semikolon fehlt
if ( $Value eq "pause") { # Das = weist einer Variablen einen Wert zu. Um etwas zu vergleichen nutzt man == oder eq.
fhem "set Roborock pause";
# return "OK Staubsauger pausiert";
$response = "OK Staubsauger pausiert" #In der letzten Zeile kann, muss aber kein Semikolon stehen.
}; #Semikolon fehlt
if ( $Value eq "start") { # Das = weist einer Variablen einen Wert zu. Um etwas zu vergleichen nutzt man == oder eq.
fhem "set Roborock start";
# return "OK Staubsauger startet";
$response = "OK Staubsauger startet"
}; #Semikolon fehlt
if ( $Value eq "laden") { # Das = weist einer Variablen einen Wert zu. Um etwas zu vergleichen nutzt man == oder eq.
fhem "set Roborock charge";
# return "OK Staubsauger fährt zur Ladestation";
$response = "OK Staubsauger fährt zur Ladestation" #In der letzten Zeile kann, muss aber kein Semikolon stehen.
}; #Semikolon fehlt
return $response;
};

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.