Alexa Custom Skill Modul

Ja der Satz ist etwas länger, wenn Du mehrere Befehle geben willst macht es eben Sinn erst den Skill z.B. mit Öffne und einen LaunchRequest zu aktivieren und dann die Session offen zu lassen. Dann kannst Du die folgenden Dialoge ohne den Invocation Name nutzten. Du hast aber pro Session jeweils nur 8 Sekunden dann wird die Session automatisch geschlossen.

Es läuft mit der Anleitung auf Anhieb. Nun noch die Schaltbefehle und alles ist supi

Ist es möglich die Built-in Intents zu nutzen oder müssten diese irgendwie noch in das Modul eingearbeitet werden? Oder reicht es aus das als Intent in der Instanz zuzuweisen?

Was meinst Du mit Schaltbefehlen? Smart Home Skills?
Da gibt es noch ein technisches Problem.

Mit dem Custom Skill kannst Du aber jetzt schon alles machen, auch schalten.

Wie? Ganz einfach:

  • Intent „TurnOnLights“ anlegen
  • Slot Type „Lamps“ anlegen mit wohnzimmer, schlafzimmer, …
  • Sample Utterances machen, z.B. TurnOnLights schalte die lampe im {lamp} ein
  • Im Default Action Script der TurnOnLights Instance z.B. mit EIB_Switch die Lampe schalten

Du solltest auch jetzt schon in der Lage sein, die Built-In Intents zu nutzen. Die Gültigkeitsprüfung des Intent-Namens lässt alle aktuell definierten zu. Du wirst halt eigene Logik definieren müssen, z.B. Dir in einer IPS Variable oder einen Session Slot den Bezug für z.B. den AMAZON.PauseIntent merken müssen. Siehe dazu auch das AMAZON.HelpIntent Action Script aus meiner Demo, wo der Session Controller über den Dummy-Slot _question in der Session den Kontext speichert, sodass der AMAZON.HelpIntent weiss, zu was er eine Hilfe ansagen muss.

Ich glaube ich nutze doch überwiegend Custom Intents weil ich bei den Standard Intents ja keine Slots zur Verfügung habe. Ich würde aber gerne unterscheiden welches Gerät z.B. Play oder Pause machen soll insofern brauche ich ja ein Unterscheidungsmerkmal.

Aber für Wetter ist der WeatherForecast Intent denke ich nützlich.

Naja, Du könntest Dir bei einem Custom Intent, der z.B. die Wiedergabe in einem Kodi startet, die Kodi Instanz in einer IPS Variable merken und dann das beim AMAZON.PauseIntent wieder auslesen.

Oder Du schreibst Dir ein Custom Intent, mit dem du das aktuell gesteuerte Entertainment-System setzt (z.B. Wohnen, Schlafen, Büro) und in einer Variable merkst. Dann könntest Du alle Built-In oder Custom Intents ohne weitere Spezifikation des Raumes nutzen.

Nur so eine Idee :slight_smile:

Ganz einfach? Ich habe leider meine Probleme!

  • Intent „Licht“ angelegt in IPS/Benutzerdef. Skript/Sprachausgeabe OK/Skript eingefügt was ich schalten möcht(bei mir BT ein)

  • Slot Type „Lampe“ angelegt mit Wohnzimmer

  • in Intent Schema
    {
    „intent“: „licht“
    },
    hinzugefügt

Wenn ich jetzt mit Alexa spreche sag sie immer kein Gerät bzw. Lampe im Konto finden!

Zunächst einmal musst Du im Intent Schema und den Sample Utterances den Slots referenzieren, sonst wird er nicht übergeben.
Schaut Dir mal meinen GetInformation Intent an, dort ist jeweils der Slot „subject“ in Verwendung.

Die von Dir genannte Fehlermeldung klingt aber eher danach, als würde Alexa nicht erkennen, dass Dein Custom Skill aufzurufen ist. Kommt überhaupt eine Anfrage an? Prüfen kannst Du das mit dem Debugging der WebHook Instanz.

Was genau (!!!) sagst du Alexa und was genau (!!!) antwortet sie?

Ich habe mir das Skill mit Haus angelegt, wenn ich jetzt sage Alexa öffne Haus sagt sie Ich kann dir die anzahl der Objekte sagen…

Was Wo Wie muss ich jetzt eintragen das Alexa das Licht schaltet? Und was muß ich zu alexa sagen?
Sehe leider noch nicht den zusammenhang der einzelnen einstellungen!

Mfg
maxx

Wie Du das genau macht ist jedem individuell überlassen. Du könntest z.B.

Passenden Intent anlegen


{
  "intents": [
    {
      "intent": "GetClimate",
      "slots": [
        {
          "name": "rooms",
          "type": "rooms"
        },
        {
          "name": "climate",
          "type": "climate"
        }
      ]
    },
    {
      "intent": "ToggleLight",
      "slots": [
                {
                  "name": "rooms",
                  "type": "rooms"
                }
                ,
      			{
                    "name": "position",
                    "type": "position" 
                },
      			{
                    "name": "device",
                    "type": "device" 
                },
             	{
                	"name": "action",
                	"type": "action" 
                }
      ]
    },
    {
      "intent": "GetInformation",
      "slots": [
        {
          "name": "subject",
          "type": "Information_Subjects"
        }
      ]
    },
    {
      "intent": "InformationSubjectResponse",
      "slots": [
        {
          "name": "subject",
          "type": "Information_Subjects"
        }
      ]
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}

Dann legst Du dazu die passenden Custom Slot Types an


rooms


wohnzimmer
wohnen
flur
büro
arbeitszimmer
schlafzimmer
schlafen
küche
garten

Analog die weiteren Slot types die Du brauchst.

Utterances festlegen nach Deinem Geschmack

z.B.


ToggleLight das Licht im {rooms} {action} schalten
ToggleLight Licht im {rooms} {action} schalten

In IP Symcon legst Du eine Instanz an gibt bei Intents in dem Fall ToggleLight an.

Wenn Du Debug anmachst siehst Du das die Daten als JSON ankommen auf diese kannst Du dann als Array im Aktionskript zugreifen

z.B.


function ExecuteAction($name, $id, array $slots, $locale, $sessionControllerId)
{
    $roomname = strtolower(@$slots['rooms']);
	$action = strtolower(@$slots['action']);
	switch ($roomname) {
        case 'wohnzimmer':
	        if(isset($slots['device'])
			{
			
			}
			if(isset($slots['device'])
			{
			
			}
			return AlexaCustomSkillPlainTextResponse::create('Das Licht wurde im '.$roomname.' '.toggleLight($roomname, $action).'geschaltet');
        case 'arbeitszimmer':
            return AlexaCustomSkillPlainTextResponse::create('Das Licht wurde im '.$roomname.' '.toggleLight($roomname, $action).'geschaltet');
        case 'büro':
            return AlexaCustomSkillPlainTextResponse::create('Das Licht wurde im '.$roomname.' '.toggleLight($roomname, $action).'geschaltet');
        case 'schlafzimmer':
            return AlexaCustomSkillPlainTextResponse::create('Das Licht wurde im '.$roomname.' '.toggleLight($roomname, $action).'geschaltet');
        case 'bad':
            return AlexaCustomSkillPlainTextResponse::create('Das Licht wurde im '.$roomname.' '.toggleLight($roomname, $action).'geschaltet');
        /*
		case '':
            $slots['_question'] = 'subject';
            return AlexaCustomSkillPlainTextResponse::create(
                'Ich kann Dir die Anzahl von Objekten nennen. Welche Art von Objekt interessiert Dich?'
            )->ContinueSession($id, $slots);
		*/	
        default:
            return AlexaCustomSkillPlainTextResponse::create(
                'Ich kenne diesen Raum nicht. Du kannst zum Beispiel nach Wohnzimmer, Arbeitszimmer, Gästezimmer, Kinderzimmer fragen.'
            )->ContinueSession($id, $slots);
    }
}

function toggleLight($roomname, $action)
{
   if($roomname == "wohnzimmer")
   {
   		if($action == "aus")
		{
			$status = "aus";
		}
		elseif($action == "ein")
		{
			$status = "ein";
		}
		elseif($action == "an")
		{
			$status = "ein";
		}
   }
   elseif($roomname == "arbeitszimmer")
   {
   		if($action == "aus")
		{
			HM_WriteValueBoolean(21790 /*[Geräte\Homematic\Räume\Büro\Arbeitszimmer Licht]*/, "STATE", false);
			$status = "aus";
		}
		elseif($action == "ein")
		{
			HM_WriteValueBoolean(21790 /*[Geräte\Homematic\Räume\Büro\Arbeitszimmer Licht]*/, "STATE", true);
			$status = "ein";
		}
		elseif($action == "an")
		{
			HM_WriteValueBoolean(21790 /*[Geräte\Homematic\Räume\Büro\Arbeitszimmer Licht]*/, "STATE", true);
			$status = "ein";
		}
   }
   elseif($roomname == "bad")
   {
   		if($action == "aus")
		{
			$status = "aus";
		}
		elseif($action == "ein")
		{
			$status = "ein";
		}
		elseif($action == "an")
		{
			$status = "ein";
		}
   }
   return $status;
}

Das Skript must Du entsprechend Deinen Slots anpassen und den Geräten die Du schalten willst.

Besser kann man’s fast nicht erklären :slight_smile:

Ich werde mal Deine Anregung aus der PM aufgreifen und meine eigene Config dann auch mit in die Beispiele aufnehmen. Das sollte hilfreich sein. Gerne nehme ich auch Beispiele von euch mit ins Repo auf.

Es gibt ja inzwischen unzählige Alexa Threads ich frage mal hier. Hat jemand von Euch eine praktikable Lösung gefunden oder irgendeine Idee wie man RGB Farben per Sprachsteuerung einstellen kann. Ein simples rot, grün, gelb usw. mag ja noch gehen aber differenzierter wäre halt nett. Wie habt ihr z.B. Eine HUE Steuerung umgesetzt. Oder schaltet ihr einfach nur per Sprache ein/aus und dimmt. Ich würde mich über Beispiele freuen.

Guter Punkt. Ich denke, dass es wohl Sinn macht, einfach noch mehr Beispielfarben zu definieren und dann evtl. mit Utterance rot {rot}% grün {gruen}% gelb {gelb}% zu arbeiten.
Weiss jemand, wie der Hue Skill es macht?

Der HUE Skill behilft sich mit Szenen. So wie icn der HUE App also Aktivieren, Frühlingsblüten, Hell, Gedimmt, Tropendämmerung, Lesen, Entspannen, Farb Schleife, Nordlichter, Konzentration, Sonnenuntergang Savanne

Wollte einfach mal Danke sagen für die tolle Arbeit! Seit gestern kann ich meine Kaffeemaschine per Alexa ein- und ausschalten sowie den Status abfragen. So viel Glück, dass Stunden bevor ich zum ersten Mal nach „IPSymcon Alexa“ google, ein Modul veröffentlicht wird, muss man erst mal haben :slight_smile:

Was muss ich eigentlich machen oder gibt es da einen Einstellung im Modul für um die Session offen zu lassen?
Also ich stelle einen Frage -> Alexa gibt die Antwort. -> Alexa fragt danach „Kann ich noch was für Dich tun?“ -> Neue Frage oder Stop oder Cancel Request.

Ok, mal ein bisschen Feedback von anderer Stelle. Nach einigem Herumprobieren habe ich mich entschlossen, dass wir jetzt einen Butler haben, und der heißt „James“. Möglich sind jetzt Formulierungen wie „Alexa, frage James ob“ und „Alexa, sage James er soll“. Ich hab ein wenig mit den Sample Utterances gespielt und bin mit dem Ergebnis jetzt ganz zufrieden. Hier ist meine aktuelle Liste:


GetInformation {subject}
GetInformation ist {subject} an
GetInformation ist {subject} angeschaltet
GetInformation ist {subject} eingeschaltet
GetInformation ist {subject} aus
GetInformation ist {subject} ausgeschaltet
GetInformation ist {subject} abgeschaltet

GetInformation ob {subject} abgeschaltet ist
GetInformation ob {subject} an ist
GetInformation ob {subject} angeschaltet ist
GetInformation ob {subject} aus ist
GetInformation ob {subject} ausgeschaltet ist
GetInformation ob {subject} eingeschaltet ist

TurnOff {subject} aus
TurnOff {subject} ausschalten
TurnOff {subject} abschalten
TurnOff schalte {subject} ab
TurnOff schalte {subject} aus
TurnOff er soll {subject} abschalten
TurnOff er soll {subject} ausschalten

TurnOn {subject} an
TurnOn {subject} ein
TurnOn {subject} einschalten
TurnOn schalte {subject} an
TurnOn schalte {subject} ein
TurnOn er soll {subject} anschalten
TurnOn er soll {subject} einschalten

InformationSubjectResponse {subject}

Danke, ich hoffe es hilft :slight_smile:

Du musst beim Erzeugen des Antwort-Objektes noch die Methode ContinueSession aufrufen.
Siehe Anleitung oder hier.