[39_Talk2Fhem.pm] Flexible Sprachsteuerunghilfsmodul

Begonnen von Phill, 12 Dezember 2017, 12:24:09

Vorheriges Thema - Nächstes Thema

Phill

#75
Sooo, ich haue mal ein Update raus mit der Bitte um zu testen. Bevor ich es dann im WIKI ergänze und  die Datei im ersten Beitrag ersetze.

Folgende Änderungen und Features sind hinzugekommen:

  • Einführung des Operanden &&: <regexp> && <regexp> && ...
    Hiermit werden die einzelnen <regexp> im Sprachkommando gesucht. Das hilft dabei wenn die Reihenfolge der Wörter nicht ganz bekannt ist.
    Beispiel:
(ein) && (schalte)\S* = $2 $1
Die Kommandos "schalte ein" und "einschalten" werden beide zu "schalte ein" konvertiert.[/li]

  • Schlüsselword $include eingeführt. Hiermit lassen sich über die Definition externe Konfigurationen einbinden.
    $include = FHEM/t2f_main.cfg
  • Im Ausführungsteil stehen jetzt folgende Variablen zur Verfügung:
    • $& -> Enthält das gefundenen Muster
    • !$& -> Enthält den Rest der nicht über die RegExp erfasst wurde.
    • $DATE -> enthält den Kompletten Datum- und Zeittext des Kommandos
    • $AGAIN -> enthält das Wort wieder wenn im Kommando das Wort wieder erkannt wurde

  • Neues Attribut T2F_filter: enthält kommaseperierte Liste mit Wörtern (regexp) die immer ignoriert werden sollen. Standart sind so wörter wie bitte, auch, kann, soll usw.
  • Die Reihenfolge der DEF wird jetzt bei der Auswertung berücksichtigt, erster Treffer ist die Phrase die genommen wird. Vorher war es zufällig.
  • Code generell etwas aufgeräumt und FHEM Helper HASH verwendet.

Bitte mal testen und Rückmeldung geben. Danke...

und @RoBra81
Zitat von: RoBra81 am 19 Januar 2018, 22:24:08
Folgende Punkte sollten beachtet werden bzw. sind noch nicht ganz ausgereift:
- ist der Detaillierungsgrad zu gering werden anders als bei z.B. Alexa ohne Rückfrage alle passenden Lampen geschaltet => evtl. möchte ich in der Antwort noch alle geschalteten Geräte auflisten
Mhhh, mit devspec2array bekommst du anhand des Filters alle Geräte in einen Array. Hilft das?
Zitat von: RoBra81 am 19 Januar 2018, 22:24:08
- die Antwort bei "schalte ein und in 5 Minuten wieder aus" ist suboptimal
Hierfür kannst du jetzt die Variable $AGAIN verwenden. Also so in der Art.
answer => '"$AGAIN" ? "" : "Gern, ich schalte $DATE $1 $2 $3 $4 $5$6 $7 $8$9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $23{true=>ein, false=>aus}"'
Es könnte theoretisch über $DATE und $AGAIN eine richtige Antwort gebaut werden. Frage ist ob es notwnendig ist.
Zitat von: RoBra81 am 19 Januar 2018, 22:24:08
- die Werte in den T2F-Attributen müssen klein geschrieben werden, damit die Filter funktionieren
Ich habe mal die Zeile auskommentiert wo das Kommando in Kleinbuchstaben umgewandelt wird, müsste mal getestet werden ob das Probleme macht. Aber generell sind die Filter in FHEM immer Groß-Klein intolerant? Und die Vergleiche in Talk2Fhem immer Groß-Klein tolerant.

So das reicht für heute Gruß...
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

RoBra81

Zitat von: Phill am 21 Januar 2018, 14:11:10
  • Einführung des Operanden &&: <regexp> && <regexp> && ...
    Hiermit werden die einzelnen <regexp> im Sprachkommando gesucht. Das hilft dabei wenn die Reihenfolge der Wörter nicht ganz bekannt ist.
Wie muss ich mir das mit dem && vorstellen? Wie muss die Logik aussehen, wenn ich die Sätze

Schalte das Licht im Esszimmer an der Decke aus
Schalte das Licht an der Decke im Esszimmer aus
Das grosse Licht im Esszimmer ausschalten


gleichbedeutend interpretieren will?

Folgendes funktioniert nicht:

(@properties)?  && (@types_switch) && (@rooms)? && (@places)? (\S+)(schalten)?

Ronny

RoBra81

Zitat von: Phill am 21 Januar 2018, 14:11:10
Ich habe mal die Zeile auskommentiert wo das Kommando in Kleinbuchstaben umgewandelt wird, müsste mal getestet werden ob das Probleme macht. Aber generell sind die Filter in FHEM immer Groß-Klein intolerant? Und die Vergleiche in Talk2Fhem immer Groß-Klein tolerant.

Ich denke, wenn Talk2Fhem alles in Kleinbuchstaben konvertiert, muss man eben die T2F-Attribute klein schreiben, schließt aber eine Fehlerquelle aus: wenn das System, welches Sprache erkennt nicht alles korrekt groß und klein schreibt, funktioniert die Erkennung, aber das Schalten scheitert...

Ronny

Phill

Eigentlich sollte es genau so funktionieren. Schick Mal ein Log 5. Aber kommentieren vorher alle def Zeilen bis auf die eine aus.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

RoBra81

2018.01.22 09:55:42.757 3: Decoding Text: Schalte das Licht im Esszimmer über dem Tisch an
2018.01.22 09:55:42.761 5: Using lists:
$VAR1 = 'ending';
$VAR2 = [
  'en',
  'er',
  'e',
  ''
];
$VAR3 = 'places';
$VAR4 = [
  'vorne',
  'vorn',
  'steckdose',
  'tür',
  'tisch',
  'esstisch',
  'decke'
];
$VAR5 = 'types_heating';
$VAR6 = [
  'heizung'
];
$VAR7 = 'rooms';
$VAR8 = [
  'esszimmer',
  'obergeschoss',
  'kinderschlafzimmer',
  'haus',
  'küche'
];
$VAR9 = 'article';
$VAR10 = [
  'im',
  'in',
  'der',
  'die',
  'das',
  'den',
  'dem',
  'an',
  'am',
  'über',
  'auf',
  'unter',
  'alle'
];
$VAR11 = 'properties';
$VAR12 = [
  'gross',
  'hell',
  'groß'
];
$VAR13 = 'types_switch';
$VAR14 = [
  'licht',
  'nachtlicht',
  'eule',
  'lampe'
];
0
2018.01.22 09:55:42.762 5: Using User Filter: 0
2018.01.22 09:55:42.762 4: Command part: 'Schalte das Licht im Esszimmer über dem Tisch an'
2018.01.22 09:55:42.764 5: get_time_by_phrase. Using eventtime: Mon Jan 22 09:55:42 2018 now: Mon Jan 22 09:55:42 2018 command: Schalte das Licht im Esszimmer über dem Tisch an
2018.01.22 09:55:42.769 5: get_time_by_phrase. Using eventtime: Mon Jan 22 09:55:42 2018 now: Mon Jan 22 09:55:42 2018 command: Schalte das Licht im Esszimmer über dem Tisch an
2018.01.22 09:55:42.773 4: Extracted Timephrase. ''
2018.01.22 09:55:42.774 5: Commandpart after datedecoding. 'Schalte das Licht im Esszimmer über dem Tisch an'
2018.01.22 09:55:42.777 5: Splited Phrase at (&&)!
$VAR1 = '(@properties)?';
$VAR2 = '(@types_switch)';
$VAR3 = '(@rooms)?';
$VAR4 = '(@places)? (\\S+)(schalten)?';
0
2018.01.22 09:55:42.779 5: Insert Lists
$VAR1 = '(gross|hell|gro\\S\\S?)?';
$VAR2 = '(licht|nachtlicht|eule|lampe)';
$VAR3 = '(esszimmer|obergeschoss|kinderschlafzimmer|haus|k\\S\\S?che)?';
$VAR4 = '(vorne|vorn|steckdose|t\\S\\S?r|tisch|esstisch|decke)? (\\S+)(schalten)?';
0
2018.01.22 09:55:42.780 5: keylists
$VAR1 = undef;
$VAR2 = 'properties';
$VAR3 = 'types_switch';
$VAR4 = 'rooms';
$VAR5 = 'places';
0
2018.01.22 09:55:42.780 5: talk Evaluate search:
Schalte das Licht im Esszimmer über dem Tisch an =~ /(@properties)?  && (@types_switch) && (@rooms)? && (@places)? (\S+)(schalten)?/i
2018.01.22 09:55:42.785 5: DIR
$VAR1 = undef;
$VAR2 = 'Licht';
$VAR3 = undef;
$VAR4 = undef;
$VAR5 = 'das';
$VAR6 = undef;
0
2018.01.22 09:55:42.785 5: Match: Licht das
2018.01.22 09:55:42.786 5: Unmatch: Schalte  im  über dem Tisch an
2018.01.22 09:55:42.786 4: Hit with phrase: qr/(@properties)?  && (@types_switch) && (@rooms)? && (@places)? (\S+)(schalten)?/i
2018.01.22 09:55:42.786 5: Handle reaction cmd: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off}
2018.01.22 09:55:42.787 5: Simple bracket selection (No. 2): 'Licht'
2018.01.22 09:55:42.788 5: Simple bracket selection (No. 3): ''
2018.01.22 09:55:42.789 5: Simple bracket selection (No. 1): ''
2018.01.22 09:55:42.790 5: Simple bracket selection (No. 4): ''
2018.01.22 09:55:42.791 4: Replaced bracket: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off} -> set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*.* $5{true=>on, false=>off}
2018.01.22 09:55:42.791 4: Advanced bracket replacement. $5true=>on, false=>off = set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*.* ###
2018.01.22 09:55:42.794 4: Keyword: 'das'
2018.01.22 09:55:42.795 5: HASH evaluation:
$VAR1 = {
  'false' => 'off',
  'true' => 'on'
};
0
2018.01.22 09:55:42.797 1: HASH Replacement Failed! set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*.* ###
2018.01.22 09:55:42.798 1: Error on Command: 'Schalte das Licht im Esszimmer über dem Tisch an'

RoBra81

Ich habe die Lösung gefunden: ich muss ihm mitteilen, dass der Schaltbefehl am Ende des Satzes steht, indem ich ein $ hinten dran hänge:

(@properties)?  && (@types_switch) && (@rooms)? && (@places)? (\S+)(schalten)?$

Jetzt muss ich nur sehen, wie ich mir in dem Fall die Antwort zusammenbaue...

Phill

#81
Laut Konfiguration wird der Schaltzustand nach dem Raum erwartet. Man könnte definieren das der Schaltzustand immer am Schluss stehen müsste.
Zitat(@properties)?  && (@types_switch) && (@rooms)? && (@places)? && (\S+)(schalten)?$
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

RoBra81


Phill

 ;) Würde aber trotzdem den Schaltzustand vom Raum unabhängig machen.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

RoBra81

#84
Zitat von: Phill am 22 Januar 2018, 10:34:21
Laut Konfiguration wird der Schaltzustand nach dem Raum erwartet. Man könnte definieren das der Schaltzustand immer am Schluss stehen müsste.

(@properties)?  && (@types_switch) && (@rooms)? && (@places)? && (\S+)(schalten)?$

Ich habe weiter getestet, aber es funktioniert leider noch nicht 100%ig: wenn ich die Fragezeichen weglasse, funktioniert es, ich muss aber alle Optionen angeben (Eigenschaft, Raum und Ort). Wenn ich die Listen optional mache, erkennt er zwar den Text, aber im Kommando fehlen die optionalen Punkte:

Def:

(@properties)? && (@types_switch) && (@rooms) && (@places) && (\S+)(schalten)?$ = (cmd=>'set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off}', answer=>'"Antwort: $& - !$&"')

Sprachbefehl:

Schalte das helle Licht im Esszimmer über dem tisch an

Cmds:

set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*tisch.* on

Das interessante ist, dass sowohl im $& als auch im !$& das "hell" fehlt:

Antwort:

Antwort: LichtEsszimmertischan - Schalte das e im über dem

Log:

2018.01.22 10:56:11.519 3: Decoding Text: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.22 10:56:11.522 5: Using lists:
$VAR1 = 'ending';
$VAR2 = [
  'en',
  'er',
  'e',
  ''
];
$VAR3 = 'places';
$VAR4 = [
  'vorne',
  'vorn',
  'steckdose',
  'tür',
  'tisch',
  'esstisch',
  'decke'
];
$VAR5 = 'types_heating';
$VAR6 = [
  'heizung'
];
$VAR7 = 'rooms';
$VAR8 = [
  'esszimmer',
  'obergeschoss',
  'kinderschlafzimmer',
  'haus',
  'küche'
];
$VAR9 = 'article';
$VAR10 = [
  'im',
  'in',
  'der',
  'die',
  'das',
  'den',
  'dem',
  'an',
  'am',
  'über',
  'auf',
  'unter',
  'alle'
];
$VAR11 = 'properties';
$VAR12 = [
  'gross',
  'hell',
  'groß'
];
$VAR13 = 'types_switch';
$VAR14 = [
  'licht',
  'nachtlicht',
  'eule',
  'lampe'
];
0
2018.01.22 10:56:11.522 5: Using User Filter: 0
2018.01.22 10:56:11.523 4: Command part: 'Schalte das helle Licht im Esszimmer über dem tisch an'
2018.01.22 10:56:11.524 5: get_time_by_phrase. Using eventtime: Mon Jan 22 10:56:11 2018 now: Mon Jan 22 10:56:11 2018 command: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.22 10:56:11.536 5: get_time_by_phrase. Using eventtime: Mon Jan 22 10:56:11 2018 now: Mon Jan 22 10:56:11 2018 command: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.22 10:56:11.548 4: Extracted Timephrase. ''
2018.01.22 10:56:11.548 5: Commandpart after datedecoding. 'Schalte das helle Licht im Esszimmer über dem tisch an'
2018.01.22 10:56:11.551 5: Splited Phrase at (&&)!
$VAR1 = '(@properties)?';
$VAR2 = '(@types_switch)';
$VAR3 = '(@rooms)';
$VAR4 = '(@places)';
$VAR5 = '(\\S+)(schalten)?$';
0
2018.01.22 10:56:11.553 5: Insert Lists
$VAR1 = '(gross|hell|gro\\S\\S?)?';
$VAR2 = '(licht|nachtlicht|eule|lampe)';
$VAR3 = '(esszimmer|obergeschoss|kinderschlafzimmer|haus|k\\S\\S?che)';
$VAR4 = '(vorne|vorn|steckdose|t\\S\\S?r|tisch|esstisch|decke)';
$VAR5 = '(\\S+)(schalten)?$';
0
2018.01.22 10:56:11.564 5: keylists
$VAR1 = undef;
$VAR2 = 'properties';
$VAR3 = 'types_switch';
$VAR4 = 'rooms';
$VAR5 = 'places';
0
2018.01.22 10:56:11.565 5: talk Evaluate search:
Schalte das helle Licht im Esszimmer über dem tisch an =~ /(@properties)? && (@types_switch) && (@rooms) && (@places) && (\S+)(schalten)?$/i
2018.01.22 10:56:11.569 5: DIR
$VAR1 = undef;
$VAR2 = 'Licht';
$VAR3 = 'Esszimmer';
$VAR4 = 'tisch';
$VAR5 = 'an';
$VAR6 = undef;
0
2018.01.22 10:56:11.569 5: Match: LichtEsszimmertischan
2018.01.22 10:56:11.570 5: Unmatch: Schalte das e  im  über dem
2018.01.22 10:56:11.570 4: Hit with phrase: qr/(@properties)? && (@types_switch) && (@rooms) && (@places) && (\S+)(schalten)?$/i
2018.01.22 10:56:11.571 5: Handle reaction answer: "Antwort: $& - !$&"
2018.01.22 10:56:11.571 4: Replaced bracket: "Antwort: $& - !$&" -> "Antwort: LichtEsszimmertischan - Schalte das e  im  über dem"
2018.01.22 10:56:11.572 3: Answer eval: "Antwort: LichtEsszimmertischan - Schalte das e  im  über dem"
2018.01.22 10:56:11.572 3: Answer result: Antwort: LichtEsszimmertischan - Schalte das e  im  über dem
2018.01.22 10:56:11.573 5: Handle reaction cmd: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off}
2018.01.22 10:56:11.573 5: Simple bracket selection (No. 2): 'Licht'
2018.01.22 10:56:11.574 5: Simple bracket selection (No. 3): 'Esszimmer'
2018.01.22 10:56:11.575 5: Simple bracket selection (No. 1): ''
2018.01.22 10:56:11.576 5: Simple bracket selection (No. 4): 'tisch'
2018.01.22 10:56:11.576 4: Replaced bracket: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off} -> set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*tisch.* $5{true=>on, false=>off}
2018.01.22 10:56:11.592 4: Advanced bracket replacement. $5true=>on, false=>off = set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*tisch.* ###
2018.01.22 10:56:11.597 4: Keyword: 'an'
2018.01.22 10:56:11.598 5: HASH evaluation:
$VAR1 = {
  'false' => 'off',
  'true' => 'on'
};
0
2018.01.22 10:56:11.599 5: Word found (true): 'an' replace with 'on'
2018.01.22 10:56:11.600 3: Text converted to: set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*.*:FILTER=T2F_places=.*tisch.* on

Phill

Da sind wir auf eine Perl Eigenheit gestoßen. Das bekomme ich auf die schnelle nicht gelöst. Muss ich mir in Ruhe mal anschauen.

Folgendes Script klappt nur wenn der gesuchte String am Anfang steht und wenn die RegExp nicht nur aus optionale Werten besteht. Ansonsten wird undef in den Array geschrieben. Man müsste es aber so formulieren das in @d alle Klammerinhalte geschrieben werden.
#!/usr/bin/perl -w
use Data::Dumper;
my $txt = "abc def ghi jkl mnop";

if (my @d = ($txt =~ /(abc)?/i)) {
        print "Klappt ".Dumper(@d);
}
if (@d = ($txt =~ /(def)?/i)){
        print "Klappt nicht ".Dumper(@d);
}
if (@d = ($txt =~ /\s(def)?/i)){
        print "Klappt ".Dumper(@d);
}


Wo sind die Perljunkies?  :)
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

RoBra81

Ich habe zwar auch mittels Google-Suche nicht ganz ergründen können, was dein Code macht, aber wenn man die Fragezeichen weg lässt, klappen alle drei Abfragen?!

Phill

#87
Auf diese Weise werden die Klammern extrahiert und in @d gespeichert. Das ist genau der Grund warum die optionalen Klammern nicht gefunden werden.
Wenn die Fragezeichen weggelassen werden, klappt es ja, nur sind die dann nicht mehr optional.
Statt "(def)?" steht bei dir "(gross|hell|gro\\S\\S?)?"
Probier Mal:
\s(@properties)? && (@types_switch) && (@rooms) && (@places) && (\S+)(schalten)?$
Aber eigentlich ist das nicht sinnvoll.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Phill

#88
Ok Problem ist, das die regexp/(was auch immer)?/ einfach nicht funktioniert, da es (ich nenne es jetzt mal einfach) zu optional ist.
Deswegen habe ich jetzt folgendes überlegt. Bei einer optionalen regexp wird diese beginnend mit einem ? deklariert. Das gibt es in Perl nicht, ist daher nicht schön aber gibt auch keine Kollision und ist die einfachste Lösung. Siehe Anhang.

?(@properties) && (@types_switch) && ?(@rooms) && ?(@places) && (\S+)(schalten)?$

Gruß
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

RoBra81

#89
Guten Morgen,

das funktioniert leider noch nicht. Ich habe meine Def wie folgt geändert:

?(@properties) && (@types_switch) && ?(@rooms) && ?(@places) && (\S+)(schalten)?$ = (cmd=>'set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off}', answer=>'"Antwort: $& - !$&"')

Wenn ich nun ein Kommando mit allen Optionen sende, wird es korrekt ausgeführt, die Variablen $& und !$& sind jedoch noch falsch. Lasse ich eine Option weg, so wird das Kommando nicht als korrekt erkannt.

Das Log mit allen Optionen:

2018.01.23 07:17:37.797 3: Decoding Text: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.23 07:17:37.801 5: Using lists:
$VAR1 = 'places';
$VAR2 = [
  'vorne',
  'vorn',
  'steckdose',
  'tür',
  'tisch',
  'esstisch',
  'decke'
];
$VAR3 = 'rooms';
$VAR4 = [
  'esszimmer',
  'obergeschoss',
  'kinderschlafzimmer',
  'haus',
  'küche'
];
$VAR5 = 'ending';
$VAR6 = [
  'en',
  'er',
  'e',
  ''
];
$VAR7 = 'types_heating';
$VAR8 = [
  'heizung'
];
$VAR9 = 'types_switch';
$VAR10 = [
  'licht',
  'nachtlicht',
  'eule',
  'lampe'
];
$VAR11 = 'article';
$VAR12 = [
  'im',
  'in',
  'der',
  'die',
  'das',
  'den',
  'dem',
  'an',
  'am',
  'über',
  'auf',
  'unter',
  'alle'
];
$VAR13 = 'properties';
$VAR14 = [
  'gross',
  'hell',
  'groß'
];
0
2018.01.23 07:17:37.802 5: Using User Filter: 0
2018.01.23 07:17:37.802 4: Command part: 'Schalte das helle Licht im Esszimmer über dem tisch an'
2018.01.23 07:17:37.805 5: get_time_by_phrase. Using eventtime: Tue Jan 23 07:17:37 2018 now: Tue Jan 23 07:17:37 2018 command: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.23 07:17:37.810 5: get_time_by_phrase. Using eventtime: Tue Jan 23 07:17:37 2018 now: Tue Jan 23 07:17:37 2018 command: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.23 07:17:37.814 4: Extracted Timephrase. ''
2018.01.23 07:17:37.815 5: Commandpart after datedecoding. 'Schalte das helle Licht im Esszimmer über dem tisch an'
2018.01.23 07:17:37.818 5: Splited Phrase at (&&)!
$VAR1 = '?(@properties)';
$VAR2 = '(@types_switch)';
$VAR3 = '?(@rooms)';
$VAR4 = '?(@places)';
$VAR5 = '(\\S+)(schalten)?$';
0
2018.01.23 07:17:37.820 5: Insert Lists
$VAR1 = '?(gross|hell|gro\\S\\S?)';
$VAR2 = '(licht|nachtlicht|eule|lampe)';
$VAR3 = '?(esszimmer|obergeschoss|kinderschlafzimmer|haus|k\\S\\S?che)';
$VAR4 = '?(vorne|vorn|steckdose|t\\S\\S?r|tisch|esstisch|decke)';
$VAR5 = '(\\S+)(schalten)?$';
0
2018.01.23 07:17:37.821 5: keylists
$VAR1 = undef;
$VAR2 = 'properties';
$VAR3 = 'types_switch';
$VAR4 = 'rooms';
$VAR5 = 'places';
0
2018.01.23 07:17:37.821 5: talk Evaluate search:
Schalte das helle Licht im Esszimmer über dem tisch an =~ /?(@properties) && (@types_switch) && ?(@rooms) && ?(@places) && (\S+)(schalten)?$/i
2018.01.23 07:17:37.822 1: TESTE: (gross|hell|gro\S\S?)
2018.01.23 07:17:37.823 1: ZEIGE: $VAR1 = 'hell';
0
2018.01.23 07:17:37.824 1: CMD: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.23 07:17:37.825 1: TESTE: (esszimmer|obergeschoss|kinderschlafzimmer|haus|k\S\S?che)
2018.01.23 07:17:37.826 1: ZEIGE: $VAR1 = 'Esszimmer';
0
2018.01.23 07:17:37.827 1: CMD: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.23 07:17:37.827 1: TESTE: (vorne|vorn|steckdose|t\S\S?r|tisch|esstisch|decke)
2018.01.23 07:17:37.829 1: ZEIGE: $VAR1 = 'tisch';
0
2018.01.23 07:17:37.829 1: CMD: Schalte das helle Licht im Esszimmer über dem tisch an
2018.01.23 07:17:37.830 5: DIR
$VAR1 = 'hell';
$VAR2 = 'Licht';
$VAR3 = 'Esszimmer';
$VAR4 = 'tisch';
$VAR5 = 'an';
$VAR6 = undef;
0
2018.01.23 07:17:37.831 5: Match: Lichtan
2018.01.23 07:17:37.831 5: Unmatch: Schalte das helle  im Esszimmer über dem tisch
2018.01.23 07:17:37.831 4: Hit with phrase: qr/?(@properties) && (@types_switch) && ?(@rooms) && ?(@places) && (\S+)(schalten)?$/i
2018.01.23 07:17:37.832 5: Handle reaction answer: "Antwort: $& - !$&"
2018.01.23 07:17:37.833 4: Replaced bracket: "Antwort: $& - !$&" -> "Antwort: Lichtan - Schalte das helle  im Esszimmer über dem tisch"
2018.01.23 07:17:37.833 3: Answer eval: "Antwort: Lichtan - Schalte das helle  im Esszimmer über dem tisch"
2018.01.23 07:17:37.834 3: Answer result: Antwort: Lichtan - Schalte das helle  im Esszimmer über dem tisch
2018.01.23 07:17:37.834 5: Handle reaction cmd: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off}
2018.01.23 07:17:37.835 5: Simple bracket selection (No. 2): 'Licht'
2018.01.23 07:17:37.836 5: Simple bracket selection (No. 3): 'Esszimmer'
2018.01.23 07:17:37.836 5: Simple bracket selection (No. 1): 'hell'
2018.01.23 07:17:37.837 5: Simple bracket selection (No. 4): 'tisch'
2018.01.23 07:17:37.837 4: Replaced bracket: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off} -> set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*hell.*:FILTER=T2F_places=.*tisch.* $5{true=>on, false=>off}
2018.01.23 07:17:37.838 4: Advanced bracket replacement. $5true=>on, false=>off = set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*hell.*:FILTER=T2F_places=.*tisch.* ###
2018.01.23 07:17:37.841 4: Keyword: 'an'
2018.01.23 07:17:37.842 5: HASH evaluation:
$VAR1 = {
  'false' => 'off',
  'true' => 'on'
};
0
2018.01.23 07:17:37.844 5: Word found (true): 'an' replace with 'on'
2018.01.23 07:17:37.845 3: Text converted to: set T2F_types_switch=.*Licht.*:FILTER=T2F_rooms=.*Esszimmer.*:FILTER=T2F_properties=.*hell.*:FILTER=T2F_places=.*tisch.* on


Log ohne Option property:

2018.01.23 07:20:19.300 3: Decoding Text: Schalte das Licht im Esszimmer über dem tisch an
2018.01.23 07:20:19.303 5: Using lists:
$VAR1 = 'places';
$VAR2 = [
  'vorne',
  'vorn',
  'steckdose',
  'tür',
  'tisch',
  'esstisch',
  'decke'
];
$VAR3 = 'rooms';
$VAR4 = [
  'esszimmer',
  'obergeschoss',
  'kinderschlafzimmer',
  'haus',
  'küche'
];
$VAR5 = 'ending';
$VAR6 = [
  'en',
  'er',
  'e',
  ''
];
$VAR7 = 'types_heating';
$VAR8 = [
  'heizung'
];
$VAR9 = 'types_switch';
$VAR10 = [
  'licht',
  'nachtlicht',
  'eule',
  'lampe'
];
$VAR11 = 'article';
$VAR12 = [
  'im',
  'in',
  'der',
  'die',
  'das',
  'den',
  'dem',
  'an',
  'am',
  'über',
  'auf',
  'unter',
  'alle'
];
$VAR13 = 'properties';
$VAR14 = [
  'gross',
  'hell',
  'groß'
];
0
2018.01.23 07:20:19.304 5: Using User Filter: 0
2018.01.23 07:20:19.304 4: Command part: 'Schalte das Licht im Esszimmer über dem tisch an'
2018.01.23 07:20:19.306 5: get_time_by_phrase. Using eventtime: Tue Jan 23 07:20:19 2018 now: Tue Jan 23 07:20:19 2018 command: Schalte das Licht im Esszimmer über dem tisch an
2018.01.23 07:20:19.320 5: get_time_by_phrase. Using eventtime: Tue Jan 23 07:20:19 2018 now: Tue Jan 23 07:20:19 2018 command: Schalte das Licht im Esszimmer über dem tisch an
2018.01.23 07:20:19.325 4: Extracted Timephrase. ''
2018.01.23 07:20:19.326 5: Commandpart after datedecoding. 'Schalte das Licht im Esszimmer über dem tisch an'
2018.01.23 07:20:19.330 5: Splited Phrase at (&&)!
$VAR1 = '?(@properties)';
$VAR2 = '(@types_switch)';
$VAR3 = '?(@rooms)';
$VAR4 = '?(@places)';
$VAR5 = '(\\S+)(schalten)?$';
0
2018.01.23 07:20:19.332 5: Insert Lists
$VAR1 = '?(gross|hell|gro\\S\\S?)';
$VAR2 = '(licht|nachtlicht|eule|lampe)';
$VAR3 = '?(esszimmer|obergeschoss|kinderschlafzimmer|haus|k\\S\\S?che)';
$VAR4 = '?(vorne|vorn|steckdose|t\\S\\S?r|tisch|esstisch|decke)';
$VAR5 = '(\\S+)(schalten)?$';
0
2018.01.23 07:20:19.333 5: keylists
$VAR1 = undef;
$VAR2 = 'properties';
$VAR3 = 'types_switch';
$VAR4 = 'rooms';
$VAR5 = 'places';
0
2018.01.23 07:20:19.333 5: talk Evaluate search:
Schalte das Licht im Esszimmer über dem tisch an =~ /?(@properties) && (@types_switch) && ?(@rooms) && ?(@places) && (\S+)(schalten)?$/i
2018.01.23 07:20:19.334 1: TESTE: (gross|hell|gro\S\S?)
2018.01.23 07:20:19.335 1: ZEIGE:
2018.01.23 07:20:19.336 1: CMD: Schalte das Licht im Esszimmer über dem tisch an
2018.01.23 07:20:19.337 1: TESTE: (esszimmer|obergeschoss|kinderschlafzimmer|haus|k\S\S?che)
2018.01.23 07:20:19.339 1: ZEIGE: $VAR1 = 'Esszimmer';
0
2018.01.23 07:20:19.339 1: CMD: Schalte das Licht im Esszimmer über dem tisch an
2018.01.23 07:20:19.340 1: TESTE: (vorne|vorn|steckdose|t\S\S?r|tisch|esstisch|decke)
2018.01.23 07:20:19.341 1: ZEIGE: $VAR1 = 'tisch';
0
2018.01.23 07:20:19.342 1: CMD: Schalte das Licht im Esszimmer über dem tisch an
2018.01.23 07:20:19.343 5: DIR
$VAR1 = 'Licht';
$VAR2 = 'Esszimmer';
$VAR3 = 'tisch';
$VAR4 = 'an';
$VAR5 = undef;
0
2018.01.23 07:20:19.344 5: Match: Lichtan
2018.01.23 07:20:19.344 5: Unmatch: Schalte das  im Esszimmer über dem tisch
2018.01.23 07:20:19.345 4: Hit with phrase: qr/?(@properties) && (@types_switch) && ?(@rooms) && ?(@places) && (\S+)(schalten)?$/i
2018.01.23 07:20:19.345 5: Handle reaction cmd: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off}
2018.01.23 07:20:19.346 5: Simple bracket selection (No. 2): 'Esszimmer'
2018.01.23 07:20:19.347 5: Simple bracket selection (No. 3): 'tisch'
2018.01.23 07:20:19.347 5: Simple bracket selection (No. 1): 'Licht'
2018.01.23 07:20:19.348 5: Simple bracket selection (No. 4): 'an'
2018.01.23 07:20:19.349 4: Replaced bracket: set T2F_types_switch=.*$2.*:FILTER=T2F_rooms=.*$3.*:FILTER=T2F_properties=.*$1.*:FILTER=T2F_places=.*$4.* $5{true=>on, false=>off} -> set T2F_types_switch=.*Esszimmer.*:FILTER=T2F_rooms=.*tisch.*:FILTER=T2F_properties=.*Licht.*:FILTER=T2F_places=.*an.* $5{true=>on, false=>off}
2018.01.23 07:20:19.349 4: Advanced bracket replacement. $5true=>on, false=>off = set T2F_types_switch=.*Esszimmer.*:FILTER=T2F_rooms=.*tisch.*:FILTER=T2F_properties=.*Licht.*:FILTER=T2F_places=.*an.* ###
2018.01.23 07:20:19.353 4: Keyword: ''
2018.01.23 07:20:19.355 5: HASH evaluation:
$VAR1 = {
  'false' => 'off',
  'true' => 'on'
};
0
2018.01.23 07:20:19.355 1: HASH Replacement Failed! set T2F_types_switch=.*Esszimmer.*:FILTER=T2F_rooms=.*tisch.*:FILTER=T2F_properties=.*Licht.*:FILTER=T2F_places=.*an.* ###
2018.01.23 07:20:19.356 1: Error on Command: 'Schalte das Licht im Esszimmer über dem tisch an'


Ronny

EDIT: noch eine Anmerkung/Idee/Wunsch zur Groß- und Kleinschreibung: wäre es möglich, bei einer gefundenen Übereinstimmung mit einem Listeneintrag nicht das Wort aus dem Sprachbefehl sondern das aus der Liste für das Zusammenbauen des Kommandos zu nutzen? Bei der Liste bin ich mir sicher, dass die Schreibweise (groß/klein) mit meinen Attributen überein stimmt...