Sprachsteuerung mit WebViewControl

Begonnen von Roman, 31 Januar 2016, 17:17:27

Vorheriges Thema - Nächstes Thema

Roman

Hallo,

nachdem ich die bisher gefundenen Lösungen der Sprachsteuerung mit if/else Abfragen eher unschön fand, hab ich eine für mich einfache Lösung angefangen. Ich stell die hier mal rein, vielleicht kann jemand etwas mit anfangen.

Die Sprachbefehle sollten relativ frei gesprochen werden können, es wird nach Stichwörtern gesucht und dann ein entsprechendes Kommando erzeugt.
z.B. funktioniert "Licht Wohnzimmer an' genauso wie 'Mach mir das Wohnzimmerlicht an" oder 'Wohnzimmerlampe anmachen"
Eine Erweiterung ist relativ schnell möglich, neue Stichwörter aufnehmen und die Kommandos in den Hash eintragen.

Durch Übergabe des Namens, könnten auch Rückmeldungen an das verwendete Gerät gesendet werden, z.B über Toast Nachrichten oder per ttySay.

Vorraussetzungen:
funktionierendes WebViewControl

Angelegtes Notify  (reagiert auf Spracheingaben aller Devices wie Handys/Tablets)

define Sprachbefehl notify .*:voiceRecognitionLastResult:.* {Sprachbefehle ("$NAME","$EVENT")}


Code in 99_myUtils.pm (Ich hab die Liste der Sprachkommandos gekürzt, die muss sowieso jeder für sich anpassen)

sub Sprachbefehle {

my $Geraet = $_[0];
my $Command = $_[1];
my $part1 = "";
my $part2 = "";
my $part3 = "";
# aus den uebergeben Wert nur das Sprachkommando extrahieren
$Command =~ s/voiceRecognitionLastResult: //;

#Nach Stichwoertern suchen
if ($Command =~ m/Licht|Lampe/i) { $part1="Licht" };
if ($Command =~ m/Rollo|Rolladen/i) { $part1="Rollo" };
if ($Command =~ m/Radio|Musik/i) { $part1="Radio" };

if ($Command =~ m/on|an|hell/i) { $part3="an" };
if ($Command =~ m/off|aus|dunkel/i) { $part3="aus" };

if ($Command =~ m/auf|rauf/i) { $part3="auf" };
if ($Command =~ m/ab|runter|zu/i) { $part3="ab" };
if ($Command =~ m/stop|halt/i) { $part3="stop" };

if ($Command =~ m/(Wohnzimmer|LED|Esszimmer|Flur|Küche|Theke|Treppe|Erdgeschoss|Badspiegel|Bad|Büro|Gästezimmer|Gästebad|Schlafzimmer|Dach|Terrassentür|Terrasse|Speisekammer)/ ) { $part2=$1 };

# Aus den Stickwoertern das Kommando bauen
my $newCommand="$part1 $part2 $part3";

# Hier wird aus dem Kommando das FHEM Kommando zugewiesen
my %Sprachkommando = (
"Licht Wohnzimmer an" => "set Licht_Wohnzimmer on",
"Licht Wohnzimmer aus" => "set Licht_Wohnzimmer off",
"Licht LED an" => "set Licht_WoZi_LED on",
"Licht LED aus" => "set Licht_WoZi_LED off",
"Licht Esszimmer an" => "set Licht_Esszimmer on",
"Licht Esszimmer aus" => "set Licht_Esszimmer off",
"Rollo Küche ab" => "set Rollo_Kueche_Strasse pct 100",
"Rollo Küche auf" => "set Rollo_Kueche_Strasse pct 0",
"Rollo Küche stop" => "set Rollo_Kueche_Strasse stop",
"Rollo Theke ab" => "set Rollo_Kueche_Seite pct 100",
"Rollo Theke auf" => "set Rollo_Kueche_Seite pct 0",
"Rollo Theke stop" => "set Rollo_Kueche_Seite stop",
"Radio Küche an" => "set StckDo_1B on",
"Radio Küche aus" => "set StckDo_1B off",
"Radio Bad an" => "set StckDo_1A on",
"Radio Bad aus" => "set StckDo_1A off"
);

# Der Dummy ist nur zur Kontrolle, bzw. um zu sehen, was wie umgesetzt wird
fhem("set Dummy_test $Geraet,$Command,$newCommand,$Sprachkommando{$newCommand}");
# hier dann das Kommando ausfuehren.
fhem("$Sprachkommando{$newCommand}");

}

speex

Hi ich finde den Ansatz ganz interessant allerdings setzt er bei mir im $newCommand  part2 nicht ist immer leer hat da jemand einen tipp für mich?

Simon74

Tip  :)
(Bei mir angepasst auf AMAD, nicht Webviewcontrol..)

###############################################################################
# Sprachbefehle
###############################################################################
sub Sprachbefehle {

my $Geraet = $_[0];
my $Command = $_[1];
my $device = "";
my $raum = "";
my $action = "";
# aus den uebergeben Wert nur das Sprachkommando extrahieren
$Command = ReadingsVal("AMADCommBridge","receiveVoiceCommand","");


#Nach Stichwoertern suchen
if ($Command =~ m/Licht|Lampe/i) { $device="licht" };
if ($Command =~ m/LED/i) { $device="led" };
if ($Command =~ m/Rollo|Rolladen/i) { $device="rollo" };
if ($Command =~ m/Radio|Musik/i) { $device="radio" };

if ($Command =~ m/on|an|1|ein|hell/i) { $action="an" };
if ($Command =~ m/off|aus|dunkel/i) { $action="aus" };

if ($Command =~ m/(Wohnzimmer|Esszimmer|Esstisch|Flur|Küche|Treppe|Badspiegel|Bad|Büro|Schlafzimmer)/i) { $raum=$1 };

# Aus den Stickwoertern das Kommando bauen
my $newCommand="$device $raum $action";

# FHEM Kommando zusammenbauen
my %Sprachkommando = (
"licht wohnzimmer an" => "set Licht_Wohnzimmer on",
"licht wohnzimmer aus" => "set Licht_Wohnzimmer off",
"led büro an" => "set t5.po_Out2 on",
"led büro aus" => "set t5.po_Out2 off",
"licht esszimmer an" => "set t5.ez.ws1 on",
"licht esszimmer aus" => "set t5.ez.ws1 off",
"licht küche an" => "set t5.ku.ws1 on; set t5.ku.ws2 on",
"licht küche aus" => "set t5.ku.ws1 off; set t5.ku.ws2 off",
);

# Logeintrag zur Kontrolle:
Log 1, "$newCommand: $Sprachkommando{$newCommand}";

# FHEM Befehl abfeuern:
fhem("$Sprachkommando{$newCommand}");

}

Simon74

Ich werde jedoch lieber mit regex in myutils weitermachen..   :)

###############################################################################
# Sprachbefehle
###############################################################################
sub Sprachbefehle {

my $sin    = ReadingsVal("AMADCommBridge","receiveVoiceCommand","");
my $audio  = "WandTablet ttsMsg";
my $ok     = "";

Log 1, "Übermittelter Sprachbefehl: $sin";

#Suche mit Regex..
if ($sin =~ /[Ww]ie.*(heisst|heißt|du).*/) { $ok="noerr";  fhem("set $audio Ich bin die Uschi, deine Wunderlampe.") };
if ($sin =~ /[Hh]austür.*(zu|schließen|schliesssen|sperren).*/) { $ok="true"; fhem("set keymatic lock") };
if ($sin =~ /.*[Aa]lle.*[Ll]ichter.*[aA]us.*/) { $ok="true"; fhem("set group=Licht:FILTER=STATE!=off off") };
if ($sin =~ /.*[Bb]üro.*[Ll]ed.*(ein|1|an).*/) { $ok="true"; fhem("set t5.po_Out2 on")};
if ($sin =~ /.*[Bb]üro.*[Ll]ed.*(aus|ab).*/) { $ok="true"; fhem("set t5.po_Out2 off")};

if ($ok eq "true")
{
#Log 1, "Sprachbefehl: Erfolgreich";
fhem("set $audio Jawohl mein Meister, das habe ich gern für dich gemacht.");
}
elsif ($ok eq "noerr")
{
#Log 1, "Sprachbefehl: Erfolgreich";
}
else
{
Log 1, "Sprachbefehl: Fehlgeschlagen";
fhem("set $audio Manchmal spricht er einfach nur wirres Zeug..");
}

}