Talk2Fhem: Unterschied zwischen den Versionen
Phill (Diskussion | Beiträge) |
Phill (Diskussion | Beiträge) |
||
Zeile 48: | Zeile 48: | ||
set talk Guten Morgen liebes Zuhause | set talk Guten Morgen liebes Zuhause | ||
Im Reading set steht der letzte gesendete Sprachbefehl | Im Reading set steht der letzte gesendete Sprachbefehl. Im Reading cmds steht das letzte ausgeführte FHEM-Kommando. | ||
Im Reading cmds steht das letzte ausgeführte FHEM-Kommando | |||
Die Antworten und Fehler werden in den Readings ''answers'' und ''err'' ausgegben. Diese können dann über ein notify weiterverarbeitet werden. | Die Antworten und Fehler werden in den Readings ''answers'' und ''err'' ausgegben. Diese können dann über ein notify weiterverarbeitet werden. |
Version vom 1. Januar 2018, 20:14 Uhr
Talk2Fhem | |
---|---|
Zweck / Funktion | |
Das Modul stellt eine Verbindung zwischen natürlicher Sprache und FHEM Befehlen her | |
Allgemein | |
Typ | undefiniert |
Details | |
Dokumentation | ModUndef |
Support (Forum) | Unterstützende Dienste |
Modulname | 39_Talk2Fhem.pm |
Ersteller | Oliver Georgi |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
IN BEARBEITUNG
Diese Seite beschreibt die Funktionsweise und Konfiguration des Moduls 39_Talk2Fhem.pm
Voraussetzungen
Es ist sehr zu empfehlen, für die Konfiguration des Moduls, im Webfrontend von FHEM die Syntaxhervorhebung zu aktivieren. Die Aktivierung des erweiterten Editors ist hier Konfiguration#Syntaxhervorhebung beschrieben.
Kenntnisse im Bereich Regulärer Ausdrücke (RegExp) in Perl sind hilfreich, aber nicht zwingend erforderlich.
Allgemeines
Das Modul Talk2Fhem stellt eine Verbindung zwischen natürlicher Sprache und FHEM Befehlen her. Die Konfiguration erfolgt dabei über das FHEM Webfrontend.
Bei der Analyse der Sprachbefehle erfolgt keine grammatikalische Analyse, sondern es wird auf definierte Schlüsselwörter reagiert. Das Modul erkennt von sich aus diverse Zeit- und Datumsangaben und löst bei Bedarf zu diesen Zeiten die FHEM Kommandos aus.
Funktionsweise
Die Zerlegung des Sprachbefehls erfolgt in mehreren Schritten.
- Aufteilen des Sprachbefehls in einzelne Kommandos bei dem Wort UND
- Erkennen von Zeit- und Datumsangaben und entfernen für die weitere Verarbeitung
- Entfernung von unnötiger Wörter
- Vergleich mit den definierten Schlüsselwörten
- Konvertieren in ein FHEM Kommando
- Zeitgebundenen auslösen des FHEM Kommandos
Installation
Solange das Modul noch nicht offiziell aufgenommen wurde, muss die Datei 39_Talk2Fhem.pm manuell in das Verzeichnis FHEM/ kopiert werden. Siehe Forumsbeitrag. [1]
Definition
define talk Talk2Fhem
Zum testen der Konfiguration ist es Ratsam erst mal das Attribut disable auf 1 zu setzen. Hierbei wird die Auslösung der FHEM Kommandos unterdrückt.
attr talk disable 1
Anwendung
Der Sprachbefehl wird über das Kommando "set" an das Modul geleitet.
set talk Guten Morgen liebes Zuhause
Im Reading set steht der letzte gesendete Sprachbefehl. Im Reading cmds steht das letzte ausgeführte FHEM-Kommando.
Die Antworten und Fehler werden in den Readings answers und err ausgegben. Diese können dann über ein notify weiterverarbeitet werden.
Beispiel
Erstellen eines Notify
define n_talk notify talk:.* {}
Folgendes in der Definition von n_talk einfügen
talk:.* { # Sende die Antwort per Telegram und gebe es über das GoogleHome aus if ($EVENT =~ s/^answers: //) { fhem("set telegram _msg \@USER $EVENT"); fhem("set d_googlespeak $EVENT"); } # Schicke den Fehler per Telegram und sag am GoogleHome das es nicht geklappt hat. if ($EVENT =~ s/^err: //) { fhem("set telbot _msg \@Oliver $EVENT"); my @a = ("Das hat leider nicht geklappt", "Es gab leider einen Fehler", "Es tut mir leid. Das hat nicht funktioniert.", "Es ist leider zu einem Fehler gekommen","Könntest du das vielleicht nochmal anders sagen", "Mhhh, das kann ich so nicht verstehen"); fhem("set d_googlespeak $a[int(rand($#a))]"); } # Schick mir alle ausgeführten Befehle als Telegram if ($EVENT =~ s/^cmds: //) { fhem("set telbot _msg \@USER $EVENT"); } }
Konfiguration
Die Konfiguration des Moduls wird hauptsächlich über die Definition (DEF) vorgenommen. Eine Konfiguration beginnt immer mit der Definition der gesuchten Schlüsselwörtern gefolgt von einem Gleichheitszeichen (siehe Randnotiz). Diese werden Anhand von Regulären Ausdrücken (RegExp) beschrieben. Also z.B.:
garage auf =
Das bededutet, sobald die Wörter in der Reihenfolge "garage" und "auf" erkannt werden, wird der Kommandoteil der Konfiguration ausgeführt. Groß- und Kleinschreibung wird grundsätzlich ignoriert.
Vor und nach dem Gleichheitszeichen muss mindestens ein Trennzeichen vorhanden sein
- Vor dem "=" mindestens ein Leer- oder Tabulatorzeichen
- Nach dem "=" können zusätzlich auch Zeilenumbrüche eingefügt werden
Der Kommandoteil folgt dem Gleichheitszeichen (siehe Randnotiz). Und kann auf folgende Arten vorliegen.
- FHEM Kommando
- { Perl Befehl }
- ( erweiterte Talk2Fhem Befehlskonfiguration )
Übersicht
<regexp> = <command>
Im ganzen könnte die Konfiguration dann so aussehen:
garage\S* auf = set dev_garage open
\S* Siehe hierzu "Häufig Verwendete RegExp".
Bei dem vorherigen Beispiel, würde der FHEM Befehl "set garage open" bei allen folgenden Sprachbefehlen ausgeführt werden.
Mach bitte die Garage auf Das haus soll das Garagentor aufmachen Garagentür in 5 Minuten auf Die Garagen soll in einer Stunde aufgemacht werden
Klammerüberführung
Es ist nicht notwendig für jeden Zustand oder jedes Gerät eine eigene Konfigurationzeile zu erzeugen. Hierfür gibt es die Möglichkeit, wie bei Regulären Ausdrücken üblich, Klammern "( )" im <regex>-Teil zu erfassen. Dies erfolgt über die Standartvariablen $1, $2, ..., $n. "n" steht hier für die nte Klammer. Zusätzlich gibt es in Talk2Fhem die Möglichkeit die Klammern zu modifizieren.
Soll die Garage auf und zugemacht werden, lässt sich folgendermaßen beschreiben.
Beispiel:
garage\S* (\S*) = set dev_garage $1
Der Satz: "Mach die Garage auf" ergibt dann als FHEM Kommando
set dev_garage auf
Klammermodifikation
Da es in den meißten Fällen nicht gewünscht ist, nur das gefunde Wort in das FHEM Kommando zu überführen, lässt sich zusätzlich das gefundene Wort modifizieren.
Variante 1: nach Typ
Hier kann die Klammer hauptsächlich auf ihren Typ hin modifiziert werden.
Definition
$n{ typ => modification, typ2 => mod2, ..., typn => modn }
typ kann eines der folgenden Wörtern enthalten:
- true sind alle Wörter die eine positive Richtung enthalten. Wie z.B. auf, ein, hoch, an, usw.
- false sind alle Wörter die eine negative Richtung enthalten. Wie z.B. ab, aus, runter, zu, usw.
- integer Wort enthält eine Zahl
- empty Wort enthält eine Leere Zeichenkette
- /<regexp>/ Wort entspricht der <regexp> ###TODO###
- else Falls keines der Fälle zutrifft
modification enthält das einzufügende Wort.
Beispiel
garage\S* (\S*) = set dev_garage $1{true=>open,false=>close}
Die Sätze:
mach die Garage auf bitte Garagentor schließen
würden hier folgende Befehle auslösen
set dev_garage open set dev_garage close
Variante 2: nach Liste
Hier kann die Klammer anhand einer oder zweier Listen selektiert werden.
Definition
$n[ wert1, wert2,,,,, wertn ]
oder
$n[ @liste ]
Innerhalb der Klammern [ ] wird eine Komma separierte Liste mit Namen erwartet die als Modifikatorliste dient. Die sogenannte Modwordlist. Die Werte sind immer optional und können leer gelassen werden. Über das Attribut T2F_modwordlist können diese Listen zur Übersicht und Wiederverwendbarkeit angelegt werden. Siehe Attribute. Auf diese Listen, lässt sich über den Namen der Liste, mit einem vorangestelltes '@' zugreifen.
Beispiel nach Position
Beim ersten Beispiel wird eine Zahl im regex-Teil erwartet (\d+). Diese Zahl entscheidet welche Position aus der Modwordlist ausgewählt werden soll.
ventilator auf (stufe )?(\d+) = set aircon $2[ off, level1, level2, level3 ]
(Stufe )? bedeutet: Das Wort Stufe kann, muss aber nicht.
Die Sätze:
Ventilator in 10 Minuten auf Stufe 0 Ventilator auf 3
würden hier folgende Befehle auslösen
set aircon off set aircon level3
Beispiel nach Vergleichsliste
Hier kommt eine weitere Liste ins Spiel. Die sogenannte Keywordlist ist eigentlich nur eine RegExp "Ver-oder-ung".
(key1|key2|...|keyn)
oder
(@keylist)
Diese Liste mit Schlüsselwörtern wird im <regex>-Teil angegeben. Hier entscheidet nicht eine Zahl über die Position, sondern die Position die in der Keywordlist einen Treffer hat wird in der Modwordlist ausgewählt. Im Attribut T2F_keywordlist können vordefinierte Listen angelegt werden und mit @keylist ausgewählt werden
blendet.* (Wohnzimmer|Esszimmer|Küche) = set $1[act_lvgroom, act_dinroom, act_kitchen] 70
.* beliebig viele Zeichen
Die Sätze:
es blendet im Esszimmer ich sitze geblendet im Wohnzimmer die sonne blendet in der Küche
würden hier folgende Befehle auslösen
set act_dinroom 70 set act_lvgroom 70 set act_kitchen 70
Ergänzung
Ähnlich wie in Variante 1, könne auch hier auf die Schlüsselwörte
empty für leere Zeichenkette
und
else für alle anderen Fälle
zugegriffen werden. Hierbei wird der Modwordlist einfach empty oder else gefolgt von dem gewünschten Wert als nächstes Element angehängt.
$n[ wert1, wert2,,,, empty, wert3, else, wert4 ]