Talk2Fhem: Unterschied zwischen den Versionen
Phill (Diskussion | Beiträge) |
Phill (Diskussion | Beiträge) |
||
Zeile 366: | Zeile 366: | ||
=== Rolladen fahren === | === Rolladen fahren === | ||
Sind die Rollläden innerhalb von FHEM über das Attribut "room" den Räumen mit Klarnamen zugeordnet, lässt sich das ganze am einfachsten konfigurieren.<br> | Sind die Rollläden innerhalb von FHEM über das Attribut "room" den Räumen mit Klarnamen zugeordnet, lässt sich das ganze am einfachsten konfigurieren.<br> | ||
'''1. nach Devicetyp''' | <u>'''1. nach Devicetyp'''</u> | ||
rolll?(os?|\S\S?den) ?(\S+ ){0,2}(\S+) (auf )?(\S+) = {fhem('set room='.ucfirst('$3').':FILTER=a:subType=blindActuator <span style='color:red'>$5</span>{true=>on, false=>off, integer=>'<span style='color:red'>set_$5</span>')} | rolll?(os?|\S\S?den) ?(\S+ ){0,2}(\S+) (auf )?(\S+) = {fhem('set room='.ucfirst('$3').':FILTER=a:subType=blindActuator <span style='color:red'>$5</span>{true=>on, false=>off, integer=>'<span style='color:red'>set_$5</span>')} | ||
Zeile 373: | Zeile 373: | ||
'''2. nach Devicenamen''' | <u>'''2. nach Devicenamen'''</u> | ||
rolll?(os?|\S\S?den) ?(\S+ ){0,2}(\S+) (auf )?(\S+) = {fhem('set room='.ucfirst('$3').':FILTER=rollo.* <span style='color:red'>$5</span>{true=>on, false=>off, integer=>'<span style='color:red'>set_$5</span>')} | rolll?(os?|\S\S?den) ?(\S+ ){0,2}(\S+) (auf )?(\S+) = {fhem('set room='.ucfirst('$3').':FILTER=rollo.* <span style='color:red'>$5</span>{true=>on, false=>off, integer=>'<span style='color:red'>set_$5</span>')} | ||
Zeile 380: | Zeile 380: | ||
'''3. nach Benutzerdefinierten Räumen'''<br> | <u>'''3. nach Benutzerdefinierten Räumen'''</u><br> | ||
Ansonsten müssen wir dem Modul sagen in welchem Raum welches Device sitzt. Das hat dafür den Vorteil das die Räume als RegExp angegeben werden können.<br>Wir erzeugen eine Modwordlist ''rollos'' in der wir alle Rollladen "Devices" auflisten. Die Reihenfolge ist an der Keywordlist "rooms" ([[Modul_Talk2Fhem#Keywordlist]]) anzupassen. | Ansonsten müssen wir dem Modul sagen in welchem Raum welches Device sitzt. Das hat dafür den Vorteil das die Räume als RegExp angegeben werden können.<br>Wir erzeugen eine Modwordlist ''rollos'' in der wir alle Rollladen "Devices" auflisten. Die Reihenfolge ist an der Keywordlist "rooms" ([[Modul_Talk2Fhem#Keywordlist]]) anzupassen. | ||
rollos = <span style='color:red'>r_alle</span>,<span style='color:red'>r_wz</span>,<span style='color:red'>r_ez</span>,,<span style='color:red'>r_buero</span>,... | rollos = <span style='color:red'>r_alle</span>,<span style='color:red'>r_wz</span>,<span style='color:red'>r_ez</span>,,<span style='color:red'>r_buero</span>,... |
Version vom 5. Januar 2018, 10:34 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! |
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 beschrieben.
Kenntnisse im Bereich Regulärer Ausdrücke (RegExp) in Perl sind hilfreich, aber nicht zwingend erforderlich. Ein kurzer Einstieg kann hier eingesehen werden. Häufig_verwendete_RegExp
Allgemeines
Das Modul Talk2Fhem stellt eine Verbindung zwischen natürlicher Sprache und FHEM Befehlen her. Es ist ein überaus flexibles und relativ einfach zu konfigurierendes Script mit dem man sehr natürlich kommunizieren kann. Die Konfiguration erfolgt dabei über das FHEM Webfrontend.
Bei der Verarbeitung 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 anhand des Wortes UND
- Erkennen von Zeit- und Datumsangaben und entfernen für die weitere Verarbeitung
- Entfernung unnötiger Wörter
- Vergleich mit den definierten Schlüsselwörtern
- Konvertieren in ein FHEM Kommando
- Zeitgebundenes 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 vorerst 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
Readings
Im Reading set steht der letzte gesendete Sprachbefehl.
Im Reading cmds steht das letzte ausgeführte FHEM-Kommando dessen Rückgabe in in das Reading fhem geschrieben wird.
Die Antworten und Modulinterne Fehler werden in den Readings answers und err ausgegben.
Das Reading status wird jedes mal gesetzt und erhält Werte nach folgender Priorität.
1. | response | wenn das FHEM Kommando eine Meldung ausgegeben hat |
2. | disabled | wenn das Attribute disable auf 1 steht |
3. | err | wenn der Sprachbefehl einen Fehler zurückgegeben hat |
4. | answer | wenn der Sprachbefehl eine Antwort ausgegeben hat |
5. | done | wenn keines der oberen Fälle eingetreten ist, also alles gut verlaufen ist |
Beispiel
Die FHEM Befehle werden eigenständig ausgeführt, sie können aber zur Überprüfung auch weitergeleitet werden. Das Beispiel zeigt auch wie auf Fehler und Antworten von Talk2Fhem reragiert werden kann. 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");
}
}
Zeitenerkennung
Die Zeit- und Datum Eingabe kann auf viele verschiedene Arten erfolgen.
Die Datumerkennung umfasst folgende Phrasen:
- morgen, übermorgen
- in ... Wochen, Monat, Jahr
- nächste Woche, Monat, Jahr
- Wochentage
- in ... Tagen
- am DATUM
Die Zeiterkennung umfasst folgende Phrasen:
- in,nach ... stunden,minuten,sekunden
- um ... (Uhr) (...)
- heute - entspricht 12:00
- früh - entspricht 9 Uhr
- abend - entspricht 18 Uhr
- nachmittag - entspricht 16 Uhr
- vormittag - entspricht 10:30 Uhr
- mittag - entspricht 12 Uhr
- gleich - entspricht 5 Minuten
- nachher - entspricht 30 Minuten
- später - entspricht 1 Stunde
- jetzt
- sofort
Datum und Zeitangaben können natürlich kombiniert werden.
Wird eine Zeit erfolgreich erkannt erfolgt die Ausführung des FHEM-Kommandos über das Modul at. Es wird ein at Eregnis angelegt welches den Namen at_<modulname>_<zeitindex> erhält.
Bei mehreren Kommandos über das Schlüsselwort UND wirkt sich der Zeitpunkt des ersten Kommandos auch auf das zweite und dritte ... aus.
Schalte die Heizung um 20 Uhr aus und mache die Rollläden runter
Beide Kommandos werden um 20 Uhr ausgelöst.
Hat das zweite Kommando ebenfalls eine Zeitphrase wird diese Zeit genommen.
schalte die Heizung heute Abend ab und mache die Rollläden jetzt runter
Zeitenmodifikation
Wie oben gesehen wird der Zeitpunkt des ersten Kommandos vor dem "und" auch für das zweite nach dem "und" gesetzt. Vorausgesetzt er wird beim 2. Kommando nicht durch eine eigenständige Zeit (hier "jetzt") ersetzt. Wenn man die Zeit des zweiten Kommandos, relativ zum ersten setzen möchte, kann dies mit den Schlüsselwörtern dann, danach oder wieder formuliert werden.
Fahre um 14 Uhr die Rollläden an der Terrasse runter und schalte dann in 2 Minuten die Bewässerung an
oder
Mach am Freitag um 5 Uhr die Heizung aus und in einer Woche wieder an
Manchmal ist es notwendig etwas vor der angegebenen Zeit auszuführen. Hier lässt sich ein Offset zu dem ermittelten Zeitpunkt hinzufügen, um ihn zu ändern.
Beispiel
dusche\S?$ = (offset=>-3600, cmd=>'set d_log bad warm')
Der Sprachbefehl
ich will um 18:30 Uhr duschen
Legt folgendes at Ergnis an
define at_assi_1513096200 at 2017-12-12T17:30:00 set d_log bad warm
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 }
- ( Modul_Talk2Fhem#erweiterte_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 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>
- 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
Befehlsumkehr
Ein zusätzlicher Vorteil dieser Methode ist, dass über das Schlüsselwort "wieder" ein Befehlsumkehr ausgelöst werden kann.
Beispiel
mach bitte die Garage auf und in 5 Minuten wieder zu
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 ] |------------------> 0 1 2 3
(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 im Eigentlichen eine RegExp "Ver-oder-ung".
( key1 | key2 | ... | keyn )
oder
( @keywordlist )
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 an selber Position 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 ]
erweiterte Befehlskonfiguration
Um Talk2Fhem in den Konfigurationszeilen weitere Parameter zu übergeben, ist eine gesonderte Syntax zu verwenden.
<regexp> = ( option => 'value' , opt2 => 'value2' , ... optn => 'valuen' )
Es stehen folgende Optionen zur Verfügung:
- cmd => enthält das FHEM Kommando. Wie oben beschrieben.
- answer => Ein in Anführungszeichen (" oder ') gesetzter Perl-Befehl, dessen Rückgabe in das Reading answer geschrieben wird.
- offset => Ganzzahliger Wert in Sekunden der dem Zeitpunkt addiert wird. Siehe Modul_Talk2Fhem#Zeitenmodifikation
Antworten
In Talk2Fhem können Antworten, die das Modul ausgeben soll, definiert werden. Hier können Fragen verarbeitet werden oder auch den Erfolg eines Kommandos bestätigt werden.
Über die Modul_Talk2Fhem#erweiterte_Befehlskonfiguration, erhält der Parameter "answer" einen Perl Befehl, dessen Rückgabe die Antwort darstellt.
Beispiel Erfolgsmeldung
tu was = ( cmd => "set tue es" , answer => '"Erledigt"' )
Man beachte hier, dass die Parameter immer in Anführungszeichen gesetzt werden müssen. In diesem Fall der Perl Befehl. Ein Text in Perl wird ebenfalls in Anführungszeichen gesetzt, deswegen die doppelten Anführungszeichen!
Beispiel Zustandsabfrage
wurde es getan = ( answer => 'Value("tue") eq "es" ? "Ja" : "Nein"')
Beispiel Temperaturabfragen
Eine einfache Temperaturabfrage könnte so aussehen.
wie.*(kalt|warm|grad|temperatur) = ( answer => '"Die Temperatur beträgt ".ReadingsVal("tempdev", "temperature", "Fehler")' )
Für eine Raumbezogene Temperaturabfrage, siehe Modul_Talk2Fhem#Anwendungsbeispiele_und_Vorlagen
Attribute
Folgende Attribute werden zur Zeit unterstützt
T2F_keywordlist
<Name> = <kommaseparierte Liste mit RegExp>
Beispiele
rooms = haus|überall|wohnung , wohnzimmer , bad\S* , toilette|wc , büro , ... names = Mama , Papa , Kevin , Jacqueline channels = ard|das erste , zdf , rtl , sat 1 , vox , rtl2 , prosieben , kabel eins , arte
Man beachte hier die möglichkeit der RegExp
Das Schlüsselwort haus löst das selbe aus wie überall und wohnung
Genauso bad oder badezimmer oder badeirgendewas
T2F_modwordlist
<Name> = <kommaseparierte Liste mir RegExp>
Die Positionen der gewählten Geräte, ist eine Zuordnung zu den Listen inT2F_keywordlist
Wenn Wohnzimmer in der keywordliste <rooms> an Position 2 steht muss der Rolladenaktor in der modworliste <roll> auch an Position 2 stehen.
roll = rollos_alle , d_rollo_wz , hm_roll_bad.* , hm_roll_wc , hm_roll_buero.* , ... lights = alle_lichte , "sw_wz1,sw_wz2" , sw_bad.* , sw_wc
Sollen einem Schlüsselwort mehrere Aktoren zugeordnet werden, geht das über sogenannte "Quotes". (Anführungszeichen) Siehe <lights>.
"a,b" oder 'a,b' oder a\,b
T2F_disableumlautescaping
Deaktiviert das Konvertieren der Umlaute innnerhalb von regulären Ausdrücken in \S\S?
T2F_language
Legt die verwendete Sprache fest. Alternativ wird das Globale Attribut language verwendet werden.
disable
Deaktiviert das Ausführen des FHEM Kommandos
verbose
Anwendungsbeispiele und Vorlagen
Hier folgen diverse Vorlagen und Beispiele die jeweils an die eigenen Bedürfnisse angepassst werden sollten/müssen. Hierzu sind die entsprechenden Stellen rot markiert.
Keywordlist
Eine typische Keywordlist wäre eine Auflistung der benötigten Räume
rooms = haus|überall|wohnung,wohnzimmer,esszimmer,bad\S*,toilette|wc, büro,schlafzimmer,ankleide|garderobe,kinderzimmer,spielzimmer, flur|gang|diele,garage,garten,terrasse,balkon, eg|erdgescho\S*,og|obergescho\S*,\S*auße\S*( haus)?|vor der tür
Einfaches schalten
licht (\S+) = set dev_light $1{ true => on, false => off }
Einfaches schalten mit eigenen Wörtern
Will man neben an/aus einen weiteren Zustand selbst definieren, kann das so geschehen.
garage (\S+) = set dev_gate $1{ /kurz/ => open-for-time 5, true => open, false => close }
Einfaches schalten mit Räumen
licht (\S+ ){0,2} (wohnzimmer|esszimmer|küche|terrasse) (\S+) = set $2(light_wz,light_ez,light_kitchen,light_outside) $3{ true => on, false => off }
Bei größeren Mengen an Räumen und Geräten bietet sich das anlegen von Keyword- und Modwordlisten an.
licht (\S+ ){0,2} (@rooms) (\S+) = set $2(@lights) $3{ true => on, false => off }
Rolladen fahren
Sind die Rollläden innerhalb von FHEM über das Attribut "room" den Räumen mit Klarnamen zugeordnet, lässt sich das ganze am einfachsten konfigurieren.
1. nach Devicetyp
rolll?(os?|\S\S?den) ?(\S+ ){0,2}(\S+) (auf )?(\S+) = {fhem('set room='.ucfirst('$3').':FILTER=a:subType=blindActuator $5{true=>on, false=>off, integer=>'set_$5')}
Erklärung
Wenn das Device vom subTyp "blindActuator" ist (HomeMatic Rolladenactor) und es im Raum $3 ist, wird dieses Device gefahren. Die Funktion ucfirst ist notwendig damit der erste Buchstabe groß geschrieben wird.
2. nach Devicenamen
rolll?(os?|\S\S?den) ?(\S+ ){0,2}(\S+) (auf )?(\S+) = {fhem('set room='.ucfirst('$3').':FILTER=rollo.* $5{true=>on, false=>off, integer=>'set_$5')}
Erklärung
Gleiche wie oben, nur das alle Devices die mit rollo beginnen im Raum $3 gefahren werden. (rollo.*)
3. nach Benutzerdefinierten Räumen
Ansonsten müssen wir dem Modul sagen in welchem Raum welches Device sitzt. Das hat dafür den Vorteil das die Räume als RegExp angegeben werden können.
Wir erzeugen eine Modwordlist rollos in der wir alle Rollladen "Devices" auflisten. Die Reihenfolge ist an der Keywordlist "rooms" (Modul_Talk2Fhem#Keywordlist) anzupassen.
rollos = r_alle,r_wz,r_ez,,r_buero,...
Definition
rolll?(os?|\S\S?den) ?(\S+ ){0,2}(@rooms)? (auf )?(\S+) = set $3[@rollos, empty, rollos_alle] $5{true=>on, false=>off, integer=>"set_$5"}
Beispielsätze
Rollos auf Rolllos Überall schließen Rollo im Wohnzimmer hoch Rolladen im Esszimmer runter Rollläden in der Küche auf 50
Damit wäre eigentlich schon alles abgedeckt. Folgendes Beispiel ist aber auch noch nützlich.
Definition
(blendet|schatte\S?) ?(\S+ ){0,2}(@rooms) = set $3[@rollos] set_70
Beispielsätze
es blendet im Esszimmer ich werde geblendet in der Küche die Sonne blendet mich im Badezimmer beschatte das Haus mach schatten im Erdgeschoss
GoogleCast Befehle
Etwas bessere Lautstärkebefehle als die von Google. Die Lautstärken müssten noch dem eigenen Geschmack angepasst werden
#GoogleCast Commandos leise$ = set googlecastdevice volume 14 normale lautstärke = set googlecastdevice volume 20 laut$ = set googlecastdevice volume 30 (ein wenig|etwas|viel)? ?(lauter|leiser) = { fhem("set googlecastdevice volume ".(ReadingsVal("googlecastdevice","volume", 0)$2[+,-]$1[3,5,10,empty,7])) }
Beispielsätze
Mach leise Mach lauter Mach etwas leiser Mach viel lauter
Talk Timer zurücksetzen
Sollen alle von Talk2Fhem angelegten Timer gelöscht werden.
(timer|kommandos) (löschen|zurücksetzen) = delete at_talk.*
Beispielsätze
bitte alle timer zurücksetzen zukünftige kommandos löschen
Frage Antwort
Raumbezogene Temperaturansage
Wir erzeugen wieder unsere Modwordlist sagen wir @sens gefüllt mit den Temperaturfühler "Devices". Reihenfolge wie immer die der Keywordlist @rooms.
wie.*(kalt|warm|grad|temperatur).*(@rooms) = ( answer => '"Die Temperatur beträgt ".ReadingsVal("$2[@sens]", "temperature", "unbekannt")." grad"' )
Beispielsätze
wie warm ist es im Wohnzimmer wie ist die Temperatur in der Küche wie kalt ist es draußen
Multiple Antworten
Hallo Haus = ( answer => '["Hallo auch!","Guten Tag!","Ahoi!"]->[rand(3)]' )
Wählt zufällig eine der drei Aussagen.
Ausgabe eines oder mehrerer Zustände
Angenommen man möchte wissen ob das Haus abgeschlossen ist. Und in FHEM existiert ein Dummy der diesen Zustand wiederspiegelt und im Reading text die offenen Fenster und Türen aufgelistet sind. Kann man folgendermaßen den Status erfragen
(alles|das haus) (zu|abgeschlossen) = ( answer => '(Value("d_schliessung") eq "zu") ? "Es ist alles zu" : "Nein, offen sind: ".ReadingsVal("d_schliessung","text","")'
Zustandsabfrage anhand des Aliasnamen
Möchte man alle Geräte anhand seines Attribut "alias" ansprechen, um dessen Status zu erfragen, könnte das so erfolgen.
Definition
(zustand|status) (\S+)* (\S+) = (answer=>'my $s=Value((grep { "$3" =~ /$attr{$_}{alias}/i } (keys %attr))[0]);; "Der Status ist ".$s if $s')
Beispielsätze
Wie ist der Zustand der Lüftung sag mir den Status der Haustür
Es ist auch möglich ein eigenes Attribut zu kreieren, und dieses als Klarnamenattribut zu verwenden. Hierzu einfach im Device global ein userattr hinzufügen. z.B.
attr global userattr T2F_alias
Jetzt stehen in allen Devices das Attribut T2F_alias zur Verfügung. Vorteil ist das dann auch wieder RegExp verwendet werden können. Im oberen Beispiel müsste dann dass rot markierte "alias" durch "T2F_alias" ersetzt werden.
Häufig verwendete RegExp
Perl Regular Expression, also ein regulärer Ausdruck der Programmiersprache Perl, ist eine Werkzeug um Zeichenketten zu beschreiben. Hier wird ein kurzer Einblick auf die im Artikel häufig genutzten RegExp zu geben.
Eine Auflistung der Syntax kann hier eingesehen werden. [2]
RegExp | Beschreibung |
---|---|
\S* | Beliebig viele (*) nicht Leerzeichen (\S). Für unbekannten und unwichtigen Wortendungen z.b. garage\S* ist bei Garage, Garagentor oder Garagentür erfolgreich |
\S+ | Mehr als ein Zeichen (+) welches kein Leerzeichen ist (\S) |
\S\S? | Ein oder zwei Zeichen die keine Leerzeichen sind. Das "?" wirkt hier nur auf das angrenzende "\S". Sollte für Umlaute verwendet werden, da bei manchen Eingabemethoden Probleme mit Umlauten auftreten können. |
(wort )? | Ein bestimmtes Wort oder nicht. |
(wort1|wort2) | Entweder wort1 oder Wort2 |
wort$ | Nur wenn das Wort am ende der Zeichenkette steht. |
(\S+){0,2} | Keins, eins oder zwei Wörter. Kann für Artikel wie z.B. "(in der|in dem|im|auf der|...)?" eingesetzt werden |
Eingabemethoden
Die Herkunft der Sprachbefehle für das Modul sind vielfältig. Hier werden einige Methoden beschrieben wie der Sprachbefehl in das Modul gelangen kann.
Messenger Telegram
Ist ein TelegramBot telbot definiert, reicht ein einfaches "notify" um die Nachrichten an FHEM an Talk2Fhem weiterzuleiten.
define n_telbot notify telbot:msgText.* set talk $EVENT
Schon kann mit FHEM gechattet werden... ;)
Google Home Geräte
Momentan ist es leider noch notwendig über einen Umweg die Sprache von einem GoogleHome in FHEM zu bringen. Hierzu ist es notwendig einen funktionierenden DNS Service am laufen zu haben. Damit FHEM per Webadresse im Internet erreichbar ist.
- Ein FHEMWEB Device anlegen
define api FHEMWEB 8087 global attr api HTTPS 1 attr api allowfrom 1 attr api csrfToken None
- Ein allowed Device anlegen
define allowed_api allowed api attr allowed_api allowedCommands set attr allowed_api allowedDevices talk attr allowed_api basicAuth {"$user:$password" eq 'user:passwort'} attr allowed_api validFor api
- Mit Googlekono bei IFTTT.com anmelden
- New Applet
- +this GoogleAssistant -> Say a phrase with a text ingredient
- Die drei Triggertexte wählen z.b.
- das Haus $
- sag dem Haus $
- frag das Haus $
- Problem bei zu kurzen Texten hat GoogleHome keine anderen Anfragen mehr angenommen.
- Einen Antworttext überlegen z.B. OK und in "What do you want the Assistant to say in response?" eintragen
- Language Deutsch
- +that Webhooks
- URL wählen
https://user:password@dnsservice:54387/fhem?cmd.talk=set talk {{TextField}}&XHR=1
- Fertig
Jetzt wird der gesamte Text bei dem genannten Triggerworten an FHEM weitergeleitet.
Ausgabemethoden
Siehe hierzu Anwendungsbeispiel