Autor Thema: SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert  (Gelesen 1934 mal)

Offline ahlermi

  • Full Member
  • ***
  • Beiträge: 170
SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« am: 17 September 2018, 13:18:28 »
Hallo zusammen,

ich habe nun eine Version gebaut mit der ich recht zufrieden bin, die SNIPS ohne große Konfiguration benutzt.


define Snips SNIPS SnipsMQTT Wohnzimmer
attr Snips response DefaultError=
NoActiveMediaDevice=
attr Snips userattr wohnzimmer_volume

Ein Dummy device:
define d_snips_dummy dummy
attr d_snips_dummy room Snips
attr d_snips_dummy snipsName Lampe, Licht, Heizung, Temperatur, Steckdose, Waschmaschine, Stehlampe, Deckenlampe, Vitrine, Kino, Leuchte, Rapsi, Denon, Anlage, Verstärker, Musik, Zone, Bluetooth, Leinwand, Radio, Wasserkocher,Rollade, Rollos, Lautstärke
attr d_snips_dummy snipsRoom Haus,überall,Wohnung, Wohnzimmer,Wohnbereich, Bad, Toilette,Wc, Büro,Arbeitszimmer, Erdgeschoss, Draußen, Schlafzimmer, Esszimmer, Bastelzimmer, Keller, Alice, Flur, Waschküche, Terasse, Küche
attr d_snips_dummy userattr snipsChannels:textField-long
attr d_snips_dummy snipsChannels Mediaplayer=Mediaplayer
Mediacenter=Mediacenter
kodi=kodi
xbmc=xbmc
OnlineMusic=OnlineMusic
Online Music=OnlineMusic
heos=heos
internet=internet
Sat=SCbl/Sat
Satellit=SCbl/Sat
Bluetooth=Bluetooth
handy=handy
echo=echo


Einmal Code um das Input rauszuspalten
define ej_SNIPS expandJSON Snips:lastIntentPayload:.\{.*input.*} input

Reaktion auf gesprochenen Text:
define n_Snips_input notify
Snips:input:.* {
  $EVENT =~ s/\srein/\sein/g;
  fhem("attr talk Snips Snips");
  fhem("set talk " . ( split / /, $EVENT, 2 )[1]);
}

Merken das der Text von Snips kam damit nicht alles über Lautsprecher ausgegeben wird.
attr talk userattr Snips

Antworten auf Reaktion von Talk2Fhem

define n_Snips notify talk:answers:.*|talk:err:.*|talk:response:.*|talk:status.*done.* {

  my $text = ["Das habe ich nicht verstanden!","Phuu das kann ich noch nicht!","keine Ahnung was du von mir willst.", "Wie bitte?"]->[rand(4)];

  if (AttrVal($NAME, "Snips", " ") ne " "){
    if ($EVTPART1 eq "done"){
      fhem ("set " . AttrVal($NAME, "Snips", " ") . " say alles klar!");
    }elsif ($EVTPART0 eq "err:"){
      fhem ("set " . AttrVal($NAME, "Snips", " ") . " say " . $text);
    }else{
      fhem ("set " . AttrVal($NAME, "Snips", " ") . " say " . ( split / /, $EVENT, 2 )[1]);
    }
    fhem ("deleteattr " . $NAME . " Snips");
  }
}


Lautsprecher leise schalten um Sprachbefehl besser zu verstehen.
define n_snips_listening_wohnzimmer notify Snips:listening_wohnzimmer.* {
  if ($EVTPART1 == 1 ){ 
    if (ReadingsVal("Denon","zoneMain","") eq "on"){
      fhem("attr $NAME wohnzimmer_volume " . ReadingsVal("Denon","volume","40"));
      fhem("set Denon volume 20");
    }
  }else{
    fhem("set Denon volume " . AttrVal($NAME, "wohnzimmer_volume", "40"));
    fhem("deleteattr $NAME wohnzimmer_volume");
  }
}

Shortcuts:


attr Snips shortcuts wir gehen=define a_Snips_tmp at +00:00:00 setreading Snips input wir gehen
« Letzte Änderung: 27 März 2019, 15:59:10 von ahlermi »
Debian FHEM, PI3 FHEM, 2 x Echo, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, WhatsApp, FLOORPLAN, Xiaomi Aqara, Sonoff

Offline enno

  • Full Member
  • ***
  • Beiträge: 472
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #1 am: 17 September 2018, 19:19:37 »
interessanter Ansatz, das beobachte ich mal weiter. Wobei ich das vielleicht mal mit https://wiki.fhem.de/wiki/Modul_Babble versuche zu verheiraten.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline ahlermi

  • Full Member
  • ***
  • Beiträge: 170
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #2 am: 17 September 2018, 19:33:11 »
Zahlen müssen konvertiert werden, SNIPS schickt im input text

so wird aus
fahre die große rollade im wohnzimmer auf siebzig prozent
fahre die große rollade im wohnzimmer auf 70 prozent

installieren:
perl -MCPAN -e 'install Lingua::DEU::Word2Num'



ausgelagert in eine Routine in 99_myT2FUtils.pm:


use Lingua::DEU::Word2Num;


sub clean_talk($){

  my $input = "";
  my $num = 0;
  my @Words = ();
  my @EVENTS = ();
  my $word = "";
  my $word_conv = "";
  my $word1 = false;
  my $word1_char = "";
  my $word1_num = 0;
  my $word2 = false;
  my $calc_num = 0;

  $input = $_[0];

  Log 3, "clean_talk: " . $input;

  @EVENTS = ( split / /, $input );
  if (!defined($EVENTS[0])){
    Log 3, "not defined";
    push @EVENTS, $input;
  }

  foreach(@EVENTS) {
     $word = "$_";
#     $word =~ s/sein/ein/g;
#     $word =~ s/rein/ein/g;
#     $word =~ s/raus/aus/g;

     $word_conv = $word;
     $word_conv =~ s/ß/ss/g;

     undef $num;
     $num = Lingua::DEU::Word2Num::w2n($word_conv);
     if ( $word_conv eq "fünfzig" ){
       $num = 50;
     }
     if ( $word_conv eq "fünf" ){
       $num = 5;
     }
     if ( $word_conv eq "zwölf" ){
       $num = 12;
     }


     Log 3, $word . " " . $num;
     
     if ( $word eq "und" && $word1 == true ) {
       $word2 = true;
     }else{
       if ( defined($num) ){
         if ( $word1 == true ){
           if ( $word2 == true ){       
             $calc_num = $word1_num + $num;
             push @Words, $calc_num;
             $word1 = false;
             $word2 = false;
           }else{
             push @Words, $word1_num;
             push @Words, $num;
             $word1 = false;
           }       
         }else{
           $word1 = true;
           $word1_num = $num;
           $word1_char = $word;
         }     
       }else{
         if ( $word1 == true ){
           if ( $word2 == true ){       
             push @Words, $word1_num;
             push @Words, "und";
             push @Words, $word;
             $word1 = false;
             $word2 = false;
           }else{
             push @Words, $word1_num;
             push @Words, $word;
             $word1 = false;
           }       
         }else{
           push @Words, $word;
           $word1 = false;
           $word2 = false;
         }
       }
     }       
  }
  if ( $word1 == true ){
    push @Words, $word1_num;
  }
  return join(' ', @Words);

}


anpassen am input Notify n_Snips_input.

Snips:input:.* {

  fhem("attr talk Snips Snips");
  fhem("set talk Snips=" . clean_talk( (split(/ /, $EVENT, 2))[1] ) );
#  fhem("set talk Snips=" . clean_talk($EVENT) );

}
« Letzte Änderung: 27 März 2019, 16:20:33 von ahlermi »
Debian FHEM, PI3 FHEM, 2 x Echo, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, WhatsApp, FLOORPLAN, Xiaomi Aqara, Sonoff

Offline ahlermi

  • Full Member
  • ***
  • Beiträge: 170
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #3 am: 11 Oktober 2018, 14:07:00 »
Da die Befehle mit Zeitangaben oft falsch verstanden worden sind habe ich einen neuen Skill "FHEM Extension Time" nach Vorlage "FHEM" von Thyraz erstellt und Freigegeben.
Dieser Skill kann zusätzlich zu "FHEM" vom Thyraz hinzugefügt werden.
Debian FHEM, PI3 FHEM, 2 x Echo, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, WhatsApp, FLOORPLAN, Xiaomi Aqara, Sonoff

Offline CBSnake

  • Sr. Member
  • ****
  • Beiträge: 505
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #4 am: 10 November 2018, 07:06:53 »
Hi,

top, klappt prima und ich muss nicht schon wieder alle Geräte neu mit Attributen bestücken ;-) und der Befehl auf Telegram und mit snips ist identisch.

Ein paar Exoten hab ich allerdings, evtl hat dazu einer eine Idee ;-)

Medizin bestätigen
Ein wenig|Etwas|viel| heller oder dunkler

Geht das ohne ein custom intent?

Grüße

Achim
FHEM auf Raspberry 3, HM-Wlan ,ZWave-Wlan, JeeLink, Wlanduino, HUE Bridge, Tradfri GU 10, TP-Link Steckdose, GHoma Steckdosen Geplant:  Multiroom.

Offline denis.robel

  • New Member
  • *
  • Beiträge: 4
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #5 am: 08 März 2019, 21:56:22 »
Hallo ahlermi,

ich bin noch absolut neu in dieser Materie.

Nur so für mein Verständnis:

1. Snips generiert einen Textoutput / Satz der dann an Talk2Fhem übergeben wird
2. Talk2Fhem wandelt den Satz und ist die Schnittstelle zu FHEM

Ist das korrekt so?

Kannst Du bitte mal die Gesamtinstallation beschreiben?

z.B. Snips - inwiefern ohne Konfiguration,
wie wird talk2fhem konfiguriert

und wie sieht die Spracheingabe aus, welche Sätze muss man sprechen, damit es funktioniert...

Ich habe noch gar keinen Plan wie ich anfangen soll Snips mit FHEM zu verheiraten..

VG Denis

Offline ahlermi

  • Full Member
  • ***
  • Beiträge: 170
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #6 am: 13 März 2019, 20:47:23 »
Hi,

top, klappt prima und ich muss nicht schon wieder alle Geräte neu mit Attributen bestücken ;-) und der Befehl auf Telegram und mit snips ist identisch.

Ein paar Exoten hab ich allerdings, evtl hat dazu einer eine Idee ;-)

Medizin bestätigen
Ein wenig|Etwas|viel| heller oder dunkler

Geht das ohne ein custom intent?

Grüße

Achim

Sowas wie Medizin bestätigen habe ich über die Snips Shortcuts gelöst.

attr  shortcuts  wir gehen={my_gehen( );}

Heller etc habe ich für Rollladen, also höher, ohne Custom intent.

#Rolladen verändern
?(bitte) && (@types_blind) && ?(@rooms) && ?(@properties) && ((\d+) (?:prozent|%|db)|1 wenig|etwas|viel) ((höher|größer|weiter auf|weiter hoch|weiter öffnen|erhöhen|weiter rauf)|(niedriger|kleiner|weiter zu|weiter runter|weiter schließen|verringern|tiefer|runter)|(lauter)|(leiser)) =
  (cmd=>{fhem("define at_talk_rollade_" . rand(600) . " at +00:00:02 set T2F_types_blind=.*$2{empty=>.+, else=>$2@}.*:FILTER=T2F_rooms=.*($3@).*:FILTER=T2F_properties=.*$4@.* $7[up,down,volumeUp,volumeDown] $6{integer=>$6, empty=>$5[0,0,3,7,15,empty,7]}")},
   answer=>'(( "$7[up,down,up,down]" eq "up") ? "$1{/bitte/=>Gern\,} ich fahre die $2 in folgenden Räumen $DATE $6{integer=>$6, empty=>$5[0,0,3,7,15,empty,7]} $2{/Lautstärke/=>Prozent, else=>Prozent} $2{/Lautstärke/=>lauter, else=>rauf}: " : "$1{/bitte/=>Gern\,} ich fahre die $2 in folgenden Räumen $DATE $6{integer=>$6, empty=>$5[0,0,3,7,15,empty,7]} $2{/Lautstärke/=>Prozent, else=>Prozent} $2{/Lautstärke/=>leiser, else=>runter}: ").T2F_answer("T2F_types_blind=.*$2{empty=>.+, else=>$2@}.*:FILTER=T2F_rooms=.*($3@).*:FILTER=T2F_properties=.*$4@.*","T2F_types_blind")')
#Rolladen setzen
?(bitte) && (@types_blind) && ?(@rooms) && ?(@properties) && (auf (\d+) (?:prozent|%|db)|(hoch|runter|rauf|zu|auf|leise|laut|stumm))( stellen| setzen| einstellen| ein)?$ =
  (cmd=>{fhem("define at_talk_rollade_" . rand(600) . " at +00:00:02 set T2F_types_blind=.*$2{empty=>.+, else=>$2@}.*:FILTER=T2F_rooms=.*($3@).*:FILTER=T2F_properties=.*$4@.* $6{integer=>$2{/Lautstärke/=>volume, /Lüfter/=>, else=>pct} $6, else=>$7{true=>$2{/Lautstärke/=>volume 70,/Lüfter/=>250, else=>pct 100}, false=>$2{/Lautstärke/=>volume 0,/Lüfter/=>0, else=>pct 0} } }")},
   answer=>'"$1{/bitte/=>Gern\,} ich fahre die $2 in folgenden Räumen $DATE $6{integer=>auf $6 Prozent, else=>$7{true=>$2{/Lautstärke/=>laut, else=>hoch}, false=>$2{/Lautstärke/=>leise, else=>runter} } }: ".T2F_answer("T2F_types_blind=.*$2{empty=>.+, else=>$2@}.*:FILTER=T2F_rooms=.*($3@).*:FILTER=T2F_properties=.*$4@.*","T2F_types_blind")')
« Letzte Änderung: 13 März 2019, 22:33:42 von ahlermi »
Debian FHEM, PI3 FHEM, 2 x Echo, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, WhatsApp, FLOORPLAN, Xiaomi Aqara, Sonoff

Offline obi

  • New Member
  • *
  • Beiträge: 40
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #7 am: 18 März 2019, 21:21:36 »
Hallo Denis,

eigentlich steht alles im 1. Post erklärt was alles zu konfigurieren ist damit es funktioniert.
Wichtig ist, dass alle Wörter welche in Talk2Fhem verwendet werden in dem Dummy "d_snips_dummy" definiert sind, damit Snips die Wörter verstehen/erkennen kann. Hierzu habe ich mir ein DOIF gebastelt, welches alle Wörter zusammenstellt und in das Dummy schreibt. Für den Anfang kannst du aber einfach die Wörter händisch in das Dummy schreiben.
Alles andere ist dann die Konfigiration von Talk2Fhem https://wiki.fhem.de/wiki/Modul_Talk2Fhem

Offline ahlermi

  • Full Member
  • ***
  • Beiträge: 170
Antw:SNIPS: Sprachsteuerung mit Modul Talk2Fhem kombiniert
« Antwort #8 am: 27 März 2019, 16:01:02 »
Habe die Antworten mal überarbeitet damit die nicht erfolgreiche Meldung einem nicht so auf den Kecks geht  :)

Außerdem ein Beispiel für Shortcuts ohne Umweg über eigene Routinen.
Debian FHEM, PI3 FHEM, 2 x Echo, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, WhatsApp, FLOORPLAN, Xiaomi Aqara, Sonoff

 

decade-submarginal