TALKTOME & TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen
TALKTOME | |
---|---|
Zweck / Funktion | |
Anbindung von RiveScript an FHEM | |
Allgemein | |
Typ | Hilfsmodul |
Details | |
Dokumentation | EN / DE |
Support (Forum) | Automatisierung |
Modulname | 42_TALKTOME.pm |
Ersteller | SirUli |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
TALKTOUSER | |
---|---|
Zweck / Funktion | |
Nutzerverbindung zu TALKTOME | |
Allgemein | |
Typ | Hilfsmodul |
Details | |
Dokumentation | EN / DE |
Support (Forum) | Automatisierung |
Modulname | 42_TALKTOUSER.pm |
Ersteller | SirUli |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Mit Hilfe der Module TALKTOME & TALKTOUSER und der Sprache RiveScript ist es möglich, Chatbots - bekannt von Webseiten wie IKEA und co - für FHEM einzusetzen, um Frage-Antwort-Dialoge zu bauen.
Features / Funktionen
Die Haupteigenschaften von XYZ sind
- Anbindung von RiveScript an fhem
- Abruf von Readings, ReadingTimestamps, Attributen
- Absetzen von fhem Befehlen oder Aufruf von perl Funktionen
Hinweise zum Betrieb mit FHEM
Voraussetzungen
Die Einrichtung von msg - das macht mir das Antworten in die diversen Kanäle sehr viel einfacher.
Installation von RiveScript in der Version 2.0.1 (oder neuer, falls eine erscheinen sollte) via CPAN. ACHTUNG nicht via apt-get installieren, da die Version zu alt ist.
msg
Bei der ersten Verwendung des Befehls "msg" wird ein Device namens globalMsg angelegt, was man aber dem Modul vorweg nehmen kann:
define globalMsg msgConfig
Damit sind die Voraussetzungen schon geschaffen
Installation von RiveScript
Rufe cpan auf:
cpan
Das sieht dann etwa so aus:
sudo cpan
Loading internal null logger. Install Log::Log4perl for logging messages
Terminal does not support AddHistory.
cpan shell -- CPAN exploration and modules installation (v2.10)
Enter 'h' for help.
cpan[1]>
Installiere dann Rivescript mit Hilfe des folgenden Kommandos:
install RiveScript
Falls Fragen aufkommen, ob man Abhängigkeiten folgen soll, dann bitte richtig beantworten (yes) ;)
Installation der Module
Geht wie immer:
update all https://raw.githubusercontent.com/SirUli/FHEM-TALKTO/master/controls_talkto.txt
Anschließend sollte man im Ordner FHEM drei zusätzliche Files (42_TALKTOME.pm, 42_TALKTOUSER.pm sowie TALKTOME.rive.template) finden. Letzteres benennt man nun um in TALKTOME.rive. An dieser Stelle darf man das File natürlich auch schon editieren - wenn man möchte und Rivescript versteht.
Definition
Dann geht es los mit der Definition des Chatbots an sich:
define FHEMTALKTOME TALKTOME
FHEMTALKTOME ist sozusagen nun der Bot, welcher zu Beginn noch deaktiviert ist. Bevor man diesen aktiviert, muss man den Pfad zum TALKTOME.rive File setzen. Ist dieses file im Ordner FHEM (sozusagen also wie Auslieferungszustand und oben beschrieben), so setzt man folgendes:
attr FHEMTALKTOME rsbrainfile ./FHEM/TALKTOME.rive
Dann kann man das Attribut "disable" entfernen. Für die Nutzerinteraktion kann man noch weitere Details eines Nutzer anlegen (derzeit nur den "richtigen" Namen), daher brauchen wir ein Benutzermodul, also z.B. für mich:
define TALKTOUSER_ULI TALKTOUSER
Bitte noch nicht wundern - derzeit ist das noch nicht voll ausgebaut, besser ihr legt erstmal nur ein Benutzergerät an.
Nun kommt der wichtigste Teil - die Einbindung einer Quelle. Bei mir ist das nun Telegram, welches nun zwei zusätzliche Attribute via userAttr bekommen muss:
talktouserMonitorReading talktouserModSourceDev
Was heissen die Attribute?
talktouserMonitorReading: Bezeichnet das Reading welches überwacht werden soll, im falle von Telegram ist dies auf "msgText" zu setzen talktouserModSourceDev: Lässt eine Änderung des Quell Devices zu. So muss beispielsweise für Telegram, damit eine Antwort machbar ist, das Quelldevice verändert werden. Lokale Readings (also vom Quellverzeichnis) werden mit %%readingname%% angegeben, das device selbst ist %DEVICE%. Für Telegram muss beispielsweise %DEVICE%:@%%msgPeerId%% gesetzt werden, damit die Antworten ankommen
Wie legt man nun Dialoge an?
Dazu empfehle ich einmal durch das Tutorial ab den "First Steps" zu gehen und sich die Beispieldatei FHEM/TALKTOME.rive.template zu Gemüte zu führen. Diese bietet schon so kleinigkeiten wie "Wie heisst du" als Fragen oder die Frage nach dem Wetter (Geräte eben entsprechend austauschen!) oder den Raumtemperaturen.
Zusätzlich:
Readings lassen sich per
<call>readingsval BK_Wetter fc1_low_c Error</call>
auslesen
Readings Timestamps lassen sich per
<call>readingstimestamp LR_Wandthermostat temperature Error</call>
auslesen
Attribute lassen sich per
<call>attrval BK_Wetter fc1_low_c Error</call>
auslesen
FHEM Kommandos kann man so ausführen:
<call>fhem set KU_SWITCH_COFFEE_Sw on</call>
Perl Methoden/Funktionen kann man so ausführen:
<call>perl chatbot_beispielfunktion</call>
Was ist derzeit noch ToDo?
- Unterscheidung von Messages aus verschiedenen Quellen mit den entsprechenden Usern (siehe oben) - derzeit geht alles über ein TALKTOUSER Gerät
- evtl. Integration mit ROOMMATE
- Überarbeitung der Dokumentation
- Unterstützung von audio als Rückkanal
- Angabe von Verzeichnissen anstelle einzelner rive-Datei
Umgesetzte Projekte
Beleuchtungssteuerung mit Telegram
Ziel
Über Telegram soll es möglich sein, die Beleuchtung im Haus ein und auszuschalten.
Ausgangssituation
Bei mir haben die meisten Geräte im FHEM das Namensschema
ET.ra.FU.Beschreibung
wobei
ET = Kürzel für Etage ra = Kürzel für Raum FU = Kürzel für Funktion
So ist zum Beispiel die Lampe im Esszimmer über dem Esstisch OG.ez.LI.Esstisch.
Umsetzung
Zunächst wird ein Menü gebaut, welches als Antwort auf die Nachricht "Hauptmenü" über Telegram gesendet wird:
.rive-Datei:
! sub hauptmenü = hauptmenue + [*] (abbrechen|hauptmenue) [*] - Hauptmenü: ^ /Licht_Aus ^ /Licht_An + leave - Untermenü verlassen \n \s \n {@ hauptmenue}
Die "/" vor den einzelnen Menüpunkten sorgen dafür, dass diese im Telegram direkt anklickbar sind.
Als nächstes werden zwei subs in der myUtils benötigt, um alle ein- bzw. ausgeschalteten Lampen zu ermitteln und als Antwort für Telegram zu formatieren:
99_myUtils.pm:
sub
chatBot_getLightsOn
{
my @lights = devspec2array('.*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy');;
my $msg = "Es sind folgende Lichter eingeschaltet:\n \n";;
my $room = "";
if (@lights > 0 and defined($defs{$lights[0]})){
foreach (@lights){
if ($room ne AttrVal($_, "room", $_))
{
if ($room ne "")
{
$msg .= " \n/".$room."_Aus \n";
}
$room = AttrVal($_, "room", $_);
$msg .= " \n".$room.": \n";
}
$_ =~ s/\./__/g;
$msg .= "/".$_." \n";
}
if ($room ne "")
{
$msg .= " \n/".$room."_Aus \n";
}
$msg .= " \n/Alle_Aus
\n \n/Hauptmenue
";;
}else{
$msg = "Es sind alle Lichter ausgeschaltet.";;
$msg .= "\n/Hauptmenue
";;
}
return $msg;
}
sub
chatBot_getLightsOff
{
my @lights = devspec2array('.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy');;
my $msg = "Es sind folgende Lichter ausgeschaltet:\n \n";;
my $room = "";
if (@lights > 0 and defined($defs{$lights[0]})){
foreach (@lights){
if ($room ne AttrVal($_, "room", $_))
{
if ($room ne "")
{
$msg .= " \n/".$room."_Ein \n";
}
$room = AttrVal($_, "room", $_);
$msg .= " \n".$room.": \n";
}
$_ =~ s/\./__/g;
$msg .= "/".$_." \n";
}
if ($room ne "")
{
$msg .= " \n/".$room."_Ein \n";
}
$msg .= " \n/Alle_Ein
\n \n/Hauptmenue
";;
}else{
$msg = "Es sind alle Lichter eingeschaltet.";;
$msg .= "\n/Hauptmenue
";;
}
return $msg;
}
Die Formatierung für Telegram erfolgt, indem die . durch __ ersetzt werden und ein / vorangestellt wird, damit es im Telegram anklickbar wird.
Nun folge die Logik für RiveScript. Zunächst die Abfrage für die Auflistung der ein- bzw. ausgeschalteten Lampen (inklusive notwendiger Definitionen):
.rive-Datei:
! array levels = eg og dg au ! array rooms = ku ez ba fk sp ks wz bu sz ! array spacer = __ _ + licht(@spacer)aus - <call>perl chatBot_getLightsOn</call>{topic=licht_aus} + licht(@spacer)an - <call>perl chatBot_getLightsOff</call>{topic=licht_an}
Anschließend die Schaltfunktionen:
.rive-Datei:
> topic licht_aus + [*] (abbrechen|hauptmenue) [*] - {topic=random} {@ leave} + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*) - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}_{formal}<star9>{/formal}> ^ Schalte Licht <get licht> aus \n ^ /Hauptmenue ^ <call>fhem set <get licht> off</call> + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*) - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}> ^ Schalte Licht <get licht> aus \n ^ /Hauptmenue ^ <call>fhem set <get licht> off</call> + alle(@spacer)aus - Schalte alle Lichter aus \n ^ /Hauptmenue ^ <call>fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy off</call> + (*)(@spacer)(*)(@spacer)aus - <set room={formal}<star1>{/formal}_{formal}<star4>{/formal}> ^ Schalte Licht in <get room> aus \n ^ /Hauptmenue ^ <call>fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> off</call> + (*)(@spacer)aus - <set room={formal}<star1>{/formal}> ^ Schalte Licht in <get room> aus \n ^ /Hauptmenue ^ <call>fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> off</call> < topic > topic licht_an + [*] (abbrechen|hauptmenue) [*] - {topic=random} {@ leave} + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*) - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}_{formal}<star9>{/formal}> ^ Schalte Licht <get licht> ein \n ^ /Hauptmenue ^ <call>fhem set <get licht> on</call> + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*) - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}> ^ Schalte Licht <get licht> ein \n ^ /Hauptmenue ^ <call>fhem set <get licht> on</call> + alle(@spacer)ein - Schalte alle Lichter ein \n ^ /Hauptmenue ^ <call>fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy on</call> + (*)(@spacer)(*)(@spacer)ein - <set room={formal}<star1>{/formal}_{formal}<star4>{/formal}> ^ Schalte Licht in <get room> ein \n ^ /Hauptmenue ^ <call>fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> on</call> + (*)(@spacer)ein - <set room={formal}<star1>{/formal}> ^ Schalte Licht in <get room> ein \n ^ /Hauptmenue ^ <call>fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> on</call> < topic
Ein möglicher Dialog mit FHEM sähe dann wie folgt aus:
Benutzer:
Hauptmenü
FHEM:
Hauptmenü: /Licht_Aus /Licht_An
Benutzer:
/Licht_An
FHEM:
Es sind folgende Lichter ausgeschaltet: Aussenwelt: /AU__ho__LI__Markise /AU__ho__LI__Terrasse /Aussenwelt_Ein Buero: /DG__bu__LI__Flur /DG__bu__LI__Schornstein /DG__bu__LI__Schreibtisch /Buero_Ein Schlafzimmer: /DG__sz__LI__Hinten_Halogen /DG__sz__LI__Hinten_Led /DG__sz__LI__Kleiderschrank /DG__sz__LI__Vorn /Schlafzimmer_Ein Wohnzimmer: /DG__wz__LI__Allgemein /Wohnzimmer_Ein Esszimmer: /OG__ez__LI__Allgemein /OG__ez__LI__Bogen /OG__ez__LI__Esstisch /OG__ez__LI__Vitrine /Esszimmer_Ein Flur_Kinder: /OG__fk__LI__Allgemein /Flur_Kinder_Ein Hausflur: /OG__hf__LI__Schuhschrank /OG__hf__LI__Treppe /Hausflur_Ein Kinderschlafzimmer: /OG__ks__LI__Allgemein /OG__ks__LI__Bett /OG__ks__LI__Sterne /Kinderschlafzimmer_Ein Kueche: /OG__ku__LI__Besenschrank /OG__ku__LI__Kuechenzeile /OG__ku__LI__Kuehlschrank /OG__ku__LI__Theke /Kueche_Ein Spielzimmer_Kinder: /OG__sp__LI__Baggerheck_Schreibtisch /OG__sp__LI__Baggerschaufel_Podest /Spielzimmer_Kinder_Ein Treppe: /OG__tr__LI__Handlauf_Fenster /Treppe_Ein /Alle_Ein /Hauptmenue
Benutzer:
/OG__ku__LI__Kuechenzeile
FHEM:
Schalte Licht OG.ku.LI.Kuechenzeile ein /Hauptmenue
Benutzer:
/OG__ku__LI__Kuechenschrank
FHEM:
Schalte Licht OG.ku.LI.Kuechenschrank ein /Hauptmenue
Benutzer:
/Hauptmenue
FHEM:
Untermenü verlassen Hauptmenü: /Licht_Aus /Licht_An
Benutzer:
/Licht_Aus
FHEM:
Es sind folgende Lichter eingeschaltet: Kueche: /OG__ku__LI__Kuechenschrank /OG__ku__LI__Kuechenzeile /Kueche_Aus /Alle_Aus /Hauptmenue
Benutzer:
/Kueche_Aus
FHEM:
Schalte Licht in Kueche aus /Hauptmenue
Beleuchtungssteuerung über Sprache
Die Module können nicht nur eingesetzt werden, um mittels Telegram zu kommunizieren. Ein weiteres Beispiel ist der Einsatz als Spracherkennung für gesprochene Befehle über z.B. AMAD. Hier ist allerdings zum jetzigen Zeitpunkt noch keine gesprochene Antwort möglich und das Zieldevice für die Antwort kann nur hardcodiert hinterlegt werden.
Zunächst müssen in der AMADCommBridge die notwendigen Attribute gesetzt werden:
attr AMADCommBridge userattr talktouserMonitorReading talktouserModSourceDev attr AMADCommBridge talktouserModSourceDev HandyRonny attr AMADCommBridge talktouserMonitorReading receiveVoiceCommand
Nun muss noch die Logik für RiveScript hinterlegt werden:
// Aus den gesprochenen Räumen werden die Kürzel ermittelt ! person badezimmer = OG.ba. ! person buero = DG.bu. ! person esszimmer = OG.ez. ! person flur_kinder = OG.fk. ! person hausflur = OG.hf. ! person kinderschlafzimmer = OG.ks. ! person kueche = OG.ku. ! person schlafzimmer = DG.sz. ! person spielzimmer_kinder = OG.sp. ! person treppe = OG.tr. ! person unten_kueche = EG.uk. ! person unten_stube = EG.st. ! person waschhaus = EG.wh. ! person wohnzimmer = DG.wz. // Aus den gesprochenen Befehlen werden die FHEM Befehle ermittelt ! person ein = on ! person an = on ! person aus = off // einige Ersetzungen, um nicht immer den konkreten Begriff verwenden zu müssen ! sub büro = buero ! sub küche = kueche ! sub bad = badezimmer ! sub flur kinder = flur_kinder ! sub kinderflur = flur_kinder ! sub spielzimmer kinder = spielzimmer_kinder ! sub spielzimmer = spielzimmer_kinder ! sub kinderspielzimmer = spielzimmer_kinder ! sub kinderzimmer = spielzimmer_kinder ! sub kueche unten = unten_kueche // Die Deckenlampe heißt meistens Allgemein ! sub decke = allgemein // Ersetzungen, um einen anderen Satzbau zu erlauben ! sub einschalten = ein ! sub anschalten = an ! sub anmachen = an ! sub ausmachen = aus ! sub ausschalten = aus /*****************************************************************************\ * Lichtsteuerung per Sprache * \*****************************************************************************/ ! array schaltenaliaseinschalten = an|ein ! array schaltenaliasausschalten = aus ! array schaltenaliashandlung = an|ein|aus ! array schaltenaliasartikel = der|die|das ! array schaltenaliasfuellwoerter = schalte|mach ! array schaltenaliasorte = in|am|auf|an|im|auf dem ! array schaltenaliashoeflich = bitte ! array roomsfull = badezimmer|buero|esszimmer|flur_kinder|hausflur|kinderschlafzimmer|kueche|schlafzimmer|spielzimmer_kinder|treppe|unten_kueche|unten_stube|waschhaus|wohnzimmer // einzelnes Licht ein- bzw. ausschalten // Bsp: [Bitte] schalte das Licht im Wohnzimmer an der Decke (ein|aus) + [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] (@roomsfull) [@schaltenaliasorte] [@schaltenaliasartikel] _ (@schaltenaliashandlung) - <set lightroom={person}<star1>{/person}LI.> ^ <set lightname={formal}<star2>{/formal}> ^ Licht <get lightroom><get lightname> wird <star3>geschaltet ^ <call>fhem set <get lightroom>.*<get lightname>.* {person}<star3>{/person}</call> // einzelnes Licht ein- bzw. ausschalten - anderer Satzbau // Bsp: [Bitte] schalte das Licht an der Decke im Wohnzimmer (ein|aus) + [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliashandlung) - <set lightroom={person}<star2>{/person}LI.> ^ <set lightname={formal}<star1>{/formal}> ^ Licht <get lightroom><get lightname> wird <star3>geschaltet ^ <call>fhem set <get lightroom>.*<get lightname>.* {person}<star3>{/person}</call> // einzelnes Licht mit zweiteiligem Namen ein- bzw. ausschalten // Bsp: [Bitte] schalte das Licht im Schlafzimmer hinten halogen (ein|aus) + [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] zwei worte _ _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliashandlung) - <set lightroom={person}<star3>{/person}LI.> ^ <set lightname={formal}<star1>{/formal}_{formal}<star2>{/formal}> ^ Licht <get lightroom><get lightname> wird <star4>geschaltet ^ <call>fhem set <get lightroom>.*<get lightname>.* {person}<star4>{/person}</call> // Licht in einem Zimmer ein- bzw. ausschalten // Bsp: [Bitte] schalte das Licht im Schlafzimmer (ein|aus) + [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] (@roomsfull) (@schaltenaliashandlung) - <set light={person}<star1>{/person}LI.> ^ Licht {formal}<star1>{/formal} wird <star2>geschaltet ^ <call>fhem set <get light>.* {person}<star2>{/person}</call>
Damit kann sind zum Beispiel für die Lampe am Küchenschrank folgende Sprachbefehle möglich (Begriffe in eckigen Klammen, wie z.B. [bitte] sind optional; durch | getrennte Begriffe in Klammern stellen Alternativen dar):
[bitte] [schalte|mache] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus) [schalte|mache] [bitte] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus) [bitte] [schalte|mache] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus) [schalte|mache] [bitte] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus) [bitte] [das] Licht [am] Küchenschrank [in] [der] Küche (an|ein|aus)[schalten|machen] [bitte] [das] Licht [in] [der] Küche [am] Küchenschrank (an|ein|aus)[schalten|machen]
Wird die konkrete Lampe weggelassen, so wird das Licht im gesamten Raum ein-/ausgeschaltet:
[bitte] [schalte|mache] [das] Licht [in] [der] Küche (an|ein|aus) [schalte|mache] [bitte] [das] Licht [in] [der] Küche (an|ein|aus) [bitte] [das] Licht [in] [der] Küche (an|ein|aus)[schalten|machen]
Da ich auch Lampen habe, deren Beschreibung aus zwei durch _ getrennten Begriffen besteht (z.B. OG.sp.LI.Baggerschaufel_Podest ist die vordere Glühbirne einer Baggerlampe, welche ein Podest beleuchtet), habe ich zwei Möglichkeiten eingebaut, diese zu schalten:
1. Ankündigung, dass es sich um einen Begriff mit zwei Worten handelt:
[bitte] [schalte|mache] [das] Licht [im] Küche [an] [der] zwei Worte Baggerschaufel Podest (an|ein|aus)
(weitere Alternativen zum Satzbau wie oben)
2. Die Beschreibung wird beim schalten generell zwischen zwei ".*" gesetzt, so dass alle Devices geschaltet werden, auf welche die Beschreibung zutrifft. Dadurch führen auch die folgenden Befehle (in allen oben beschriebenen Satzbauvarianten) zum Erfolg:
[bitte] [schalte|mache] [das] Licht [im] Küche [am] Podest (an|ein|aus) [bitte] [schalte|mache] [das] Licht [im] Küche [an] [der] Baggerschaufel (an|ein|aus)
Dadurch ist zu beachten, dass z.B. bei den beiden Lampen DG.sz.LI.Hinten_Led und DG.sz.LI.Hinten_Halogen mit
[bitte] [schalte|mache] [das] Licht [im] Schlafzimmer hinten (an|ein|aus)
beide Lampen geschaltet werden und mit
[bitte] [schalte|mache] [das] Licht [im] Schlafzimmer Halogen (an|ein|aus)
nur eine der beiden.
Weblinks
- Forumsartikel Module: TALKTOME & TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen
- Forumsartikel Neuer FHEM Befehl "msg" für Benachrichtigungen
- RiveScript First steps
- Modul AMAD