TALKTOME & TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
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 der Module 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 für Antworten an die diversen Geräte.
  • 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

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.

Wenn man sich übrigens später sicher ist, dass man das dauerhaft nutzen will, würde ich das update command mit in den reguläre update Prozess einbinden:

update add https://raw.githubusercontent.com/SirUli/FHEM-TALKTO/master/controls_talkto.txt

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 pflegen(derzeit nur den "richtigen" Namen), daher brauchen wir ein Benutzermodul, also z.B. für mich:

define TALKTOUSER_ULI TALKTOUSER

ACHTUNG EINSCHRÄNKUNG: Derzeit ist nur ein Nutzer sinnvoll - da keine Filterung in den Geräten vorhanden ist. Siehe ToDo-Liste im Forenthread

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

(wenn du keine Ahnung hast: attr TELEGRAMBOT userattr 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 Quelldevice) 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>

Hinweise:

  • Wie aus den beispielen Erkennbar sind alle handler, also die Zeilen welche mit "+" beginnen, klein geschrieben und das ist Absicht!
  • Standardmäßig werden die Zeichen .,!?;:¡¿ als überflüssige Satzzeichen behandelt und daher ausgefiltert. Will man nun (wie unten beschrieben) Telegram-Kommandos (welche mit / beginnen) ausführen lassen, so empfiehlt es sich, das Attribut rspunctuation auf .,!?;:¡¿/ zu setzen. Somit kann dann Rivescript aus "/Temperaturen" den Befehl "temperaturen" filtern und auf diesen reagieren.

Was ist derzeit noch ToDo?

Siehe Thread

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