Patami Alexa Skill Framework

Das sollte an sich kein Problem sein Du musst nur für jeden Intent eine Custom Skill Intent Instanz erstellen. Wenn die Formulierung die im Intent festgelegt worden ist greift, dann sollte dieser auch auslösen und dann das passende Skript zum Intent triggern.

Ja das habe ich mir gedacht aber wie bekomme ich es im Custom Skill mehrere mehrere Custom Skill Intents zu verknüpfen?

Gesendet von meinem SGP712 mit Tapatalk

Du hast einen Alexa Custom Skill das ist der I/O. Du kannst so viele Custom Skill Intent Instanzen haben wie Du brauchst, Du musst nur einfach als übergeordnete Instanz jeweils den gleichen Custom Skill IO zuordnen.

harmony 2.png

Ah jetzt ja, eine Insel. Ich Depp hab gedacht das geht über das Dropdown im Custom Skill. Jetzt hab ich es verstanden, ausprobiert und es klappt. Vielen Dank Fonzo.

Gesendet von meinem SGP712 mit Tapatalk

Ps: Die andere Idee werde ich mir aber auch noch genau anschauen.

Gesendet von meinem SGP712 mit Tapatalk

Der Custom Skill ist der IO, dieser nimmt die Daten von Deinem Skill entgegen, die Sachen die dieser macht kannst Du im Debug Fenster einsehen. Jeder Skill hat mehrere Intents. Bestimmte Intents sind Pflicht wie AMAZON.Helpintent (Wird bei Hilfe aufgerufen), AMAZON.StopIntent (Dient dem Abbruch), AMAZON.ChancelIntent darüber hinaus kannst Du so viele Intents anlegen wie Du eben brauchst. Das heißt ein Skill besteht schon mal aus einem IO und mindestens vier Custom Intent Skill Instanzen, davon 3 die Pflicht Intents von Amazon und min. einen eigenen Intent, der soll ja was entgegennehmen und dann ausführen. Alle Intent haben die gleiche übergeordnete Instanz. Im IO gibst Du den Launch Intent an. Das ist der Intent der aufgerufen wird wenn Du kein Befehl an einen Skill übergibst. Wenn der Skill Heim heisst und Du sagst Alexa starte Heim dann wird der Launch Intent aufgerufen. Dementsprechend kann es auch nur einen Launch Intent geben. Sobald Du dem Skill einen Befehl mitgibst kommt wird dann der Intent aufgerufen den Du im Interaction Modell definiert hast mit Deiner Redewendung.

Der im Skill konfigurierte Intent wird nur aufgerufen, wenn Du den Skill ohne Intent aufrufst, d.h. z.B. sagst „starte meinskill“. Wenn Du sagst „aktiviere {party} modus mit meinskill“, dann könntest du je nach Config den hinterlegten Intent (der sich vom LaunchRequest Intent unterscheidet) aufrufen und das Wort „party“ als Intent Slot übergeben.

Im Intent kannst Du außerdem mit $request->GetIntentName() den Namen des Intents herausfinden.
Trotzdem musst Du für jeden Intent eine Alexa Custom Skill Intent Instanz anlegen, dort den Namen des Intents konfigurieren – als Skript kannst Du dann für jeden Skill dasselbe nutzen und mit $request->GetIntentName() differenzieren, welcher Intent aufgerrufen wurde. Oder halt für jeden Intent ein eigenes Skript verwenden, aber das kommt auf Deine Logik an, was mehr SInn macht.

Vielen Dank für die ausführliche Beschreibung. Das hilft mir gut weiter. Jetzt muss ich mir „nur noch“ Gedanken über den richtigen Aufbau machen. Da werde ich mir die Anregungen von Fonzo mal genau anschauen und die ausprobieren.
Endlich mal wieder eine echt spannende Sache das. Mit den Echos.

Gesendet von meinem ONEPLUS A3003 mit Tapatalk

Hallo Gemeinde,

ich hab mir heute mal vorgenommen, einen eigenen skill zu entwerfen…puh…hört sich erstmal nicht so einfach an.

Aber egal…muß ja :slight_smile:

Allerdings fliege ich hier (Screenshot) schon aus der Anleitung, da Amazon anscheinend da etwas geändert hat.
Ohne etwas in die Default Spalte einzutragen komme ich hier nicht weiter :frowning:

Kann mir da jemand helfen ?

Liebe Dank
Sascha

EDIT: ok, ich habe nun in das Default Feld genau das gleiche eingetragen wie für Europa. So geht es auf jeden Fall erstmal :slight_smile:

So, wieder einen Schritt weiter…

meinen ersten Intent habe ich Datenbank genannt.

Im Actionscript gibt sie ja erstmal „test“ als antwort…das funktioniert gut.

Ich habe das Script angepaßt, aber leider sagt sie mir nun, sie könne das nicht starten, da das script ungültig ist…

Was genau ist denn hier fehlerhaft ?

<?

$datenbank = GetValueInteger(24567 /*[Patami Framework\IPS Größe Datenbank]*/);
$text = "Die Datenbank ist".$datenbank."m b groß";

function Execute(Request $request)
{
	// Write your own code here
	return TellResponse::CreatePlainText($text);
}
?>

Lieben Dank für die Hilfe :slight_smile:

Im Skript wird zunächst immer die Funktion Execute aufgerufen. Das heist das alles was Du dann in folge machst, muss auch innerhalb der Funktion stehen weil die Funktion selber die Parameter in der Variable $request als Array übergibt.

So ist also richtig

<?


function Execute(Request $request)
{
	

$datenbank = GetValueInteger(24567 /*[Patami Framework\IPS Größe Datenbank]*/);
$text = "Die Datenbank ist".$datenbank."m b groß";
// Write your own code here
	return TellResponse::CreatePlainText($text);
}
?>

Wobei Du in dem Fall gar nichts von Alexa auswertest in dem Beispiel antwortet Dir Alexa dann stets das gleiche.

Hallo Fonzo und vielen Dank :slight_smile: Das geht schon mal super jetzt !!! :slight_smile:

Wie würdest du das lösen, damit ich meine verschiedenen Lichtstimmungen aufrufen kann ?

Sagen wir mal ich habe Stimmung Rot und Stimmung Rot/Blau.

Würde ich da einen Intent „Stimmung“ machen und dann einen Slot Type im Skill mit 2 Einträgen, einmal Rot und einmal Rot Blau ?
Wie würde dann das Script in IPS aussehen ?

Oder ein anderes Beispiel meine Temperatursensoren abzufragen. Hierzu habe ich mal 2 Screenshots gemacht.
Gehe ich da schon in die richtige Richtung ? Wenn ja, wie muß dann ein Script in IPS aussehen, um die sensoren zu unterscheiden, wenn der intent auslöst ?

Entschuldige bitte die vielen Fragen, aber am Anfang brauche ich wohl ein wenig unterstützung bis es „klick“ macht :slight_smile:

LG
Sascha


ok…man muß mich nur mal 5 Stunden alleine lassen :slight_smile:

Dieses Script habe ich mal an den Start gebracht, und funktioniert ganz gut bis auf 2 Sachen.

<?
function Execute(Request $request)
{
    
	$tempwohn   = GetValueFloat(51255 /*[Unsere Wohnung\Zimmer\Wohnzimmer\Heizung\Temperatur Wohnzimmer\Temperatur]*/);
	$temppool   = GetValueFloat(12505 /*[Hardware\Homematic\Sensoren\Pool Temperatur Differenz \Sensor 1 (Pooltemperatur)\Pooltemperatur]*/);
	$tempaussen = GetValueFloat(29335 /*[Hardware\Homematic\Sensoren\Aussen Temperatur\Temperatur Aussen]*/);
	
	
    $sensor = strtolower($request->slots->sensoren);
        
    if($sensor != "")
            {
                if ($sensor == "wohnzimmer")
				{
                $text = "Im Wohnzimmer beträgt die Temperatur".$tempwohn."grad";
				}
				elseif ($sensor == "pool")
				{
                $text = "Im Pool beträgt die Temperatur".$temppool."grad";
				}
				elseif ($sensor == "aussen")
				{
                $text = "Aussen beträgt die Temperatur".$tempaussen."grad";
				}  
				
            }
        
    // Tell the user 
    return TellResponse::CreatePlainText(
        $text
    )->SetSimpleCard(
        'Modus IP-Symcon',
        $text
    ); 
    
}

Alexa hat mit punkt oder komma ja so ihre probleme…wie fangt ihr das ab ? Bei mir sagt sie zum Beispiel 22 „PAUSE“ 5 grad. Das verwirrt etwas.

Die 2. Sache ist, kann mir mal jemand erklären, was es mit der SetSimpleCard auf sich hat ? Für was brauche ich das, bzw wo kann es mir helfen ?

Vielen Dank und liebe Grüße
Sascha

Grundsätzlich gehst Du vor zum Einrichten wie in der Dokumention unter Beispiel beschrieben.
Bei Punkt 4 der Anleitung kommst Du zum Skill Builder.

Hier legst Du das Interaction Model an. Du findest auf der linken Spalte die Einstellungen und den Bereich Code Editor

Um Code den Du in einem anderen Editor oder z.B. hier als Vorlage übernommen hast zu importieren gehst Du auf
Code Editor.png

und klickst dann auf
darg json file.png
daraufhin öffnet sich ein Dialog in dem Du die Datei auswählst die Du importieren willst.

Hier ist mal ein Beispiel einer Basis Grundlage die Du beliebig ausbauen kannst

Interaction Model über Code Editor importieren


{
  "intents": [
    {
      "name": "AMAZON.CancelIntent",
      "samples": []
    },
    {
      "name": "AMAZON.HelpIntent",
      "samples": []
    },
    {
      "name": "AMAZON.StopIntent",
      "samples": []
    },
    {
      "name": "Light",
      "samples": [
        "im {Room} auf {Color} setzten",
        "im {Room} auf {Color} schalten",
        "im {Room} die Farbe auf {Color} stellen"
      ],
      "slots": [
        {
          "name": "Room",
          "type": "Roomname",
          "samples": []
        },
        {
          "name": "Color",
          "type": "Colorscence",
          "samples": []
        }
      ]
    }
  ],
  "types": [
    {
      "name": "Colorscence",
      "values": [
        {
          "id": null,
          "name": {
            "value": "Rot",
            "synonyms": []
          }
        },
{
          "id": null,
          "name": {
            "value": "Grün",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "Rot Blau",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "Blau",
            "synonyms": []
          }
        }
      ]
    },
    {
      "name": "Roomname",
      "values": [
        {
          "id": null,
          "name": {
            "value": "Wohnzimmer",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "Schlafzimmer",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "Heimkino",
            "synonyms": [
              "Home Cinema"
            ]
          }
        }
      ]
    }
  ]
}

Dann richtest Du denn Skill weiter ein. In IP-Symcon würdest Du entsprechend dem Interaction Modell einen Custom Skill Intent anlegen mit dem intent Namen Light.

Das grundlegende Action Script sieht so aus


<?
function Execute(Request $request)
{
	if($request->IsLaunchRequest())
	{
		$text = 'Dies war der Launch Intent von Lichtstimmung Du kannst mit mir Farben von Lampen einstellen';
	}
	
	$room = strtolower($request->slots->Room);
	$colorscene = strtolower($request->slots->Color);
	if ($room != "" && $colorscene != "")
	{
		// Set Device
		// your command
		switch ($room)
		{
		case 'wohnzimmer':  
			// set device living room
			
			break;
		case 'schlafzimmer':
			// set device bed room
			
			break;
		default:
            // The subject slot was invalid
            // Ask the user for the correct object type
            return AskResponse::CreatePlainText(
                'Diesen Raum kenne ich nicht. Zu welchem Raum wolltest Du Informationen haben?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
		}
		// Response
		$text = "Ich habe im ".$room." die Farbe ".$colorscene." eingestellt"; 
	}
	else
	{
		$text = "Ich konnte den Raum ".$room." oder die Farbe ".$colorscene." leider nicht verstehen.";
	}
	
	
	return TellResponse::CreatePlainText($text);
}

Du nimmst hier zunächst die Intent Slots Room und Color entgegen und schreibst diese in eine Variable $room und $colorscene. Mit diesen beiden Variablen kannst Du jetzt weiterarbeiten. Du kannst beliebig viele Intent Slots nutzten dementsprechnd komplex kannst Du so einen Dialog dann auch gestalten bzw. muss diesen dann entsprechend im Skript auswerten. In dem Beispiel wird geschaut welchen Raum Du schalten willst. Darunter käme dann Dein eigener Code. Du kannst Dann nach Farbe vergleichen und bei einer bestimmten Farbe einen bestimmten Befehl absetzten. Wie dieser Befehl aussieht variiert ja von gerät zu gerät das Du in IP-Symcon und System schalten willst.

Das ist zumindest mal eine Grundlage um sich daran zu orientieren das ganze kannst Du beliebig komplex ausbauen, das Skript wird dann bei zunehmender Raum Anzahl und Farben natürlich deutlich länger.

Es gibt eine Alexa App in der Du auch Skills verknüpfst bzw. Einstellungen vornimmst. An diese App kannst Du auch Informationen durch Deinen Skill schicken wenn Du dies als Text angezeigt bekommen willst. Wenn Du also nicht nur angesagt bekommen willst wie die Temperatur ist sondern dies später noch mal nachschauen willst oder weitere Zusatzinformation anzeigen lassen willst, kannst Du das als Card in die App ausgeben. Du fragst z.B. Alexa nach der Temperatur und in die Card gibst Du dann z.B. zusätzlich noch die Luftfeuchte und weitere Dinge mit an, oder den Wetterbericht usw.

Grundsätzlich kannst Du Alexa auch fortgeschrittene Texte ausgeben lassen und sie klar anweisen wie etwas auszusprechen ist. Dazu wird SSML benutzt dies wird in der SSML Dokumentation von Alexa näher erläutert. Ich muss jetzt selber mal schauen ob das in der Doku zum Patami Framework mit einem Beispiel beschrieben ist, ansonsten kann da am Besten Patami was zu sagen oder man ergänzt da dann noch ein paar Beispiele in der Dokumention. Damit ist dann so ziemlich viel möglich, es macht das ganze aber auch deutlich komplexer als wenn Du Alexa einfach nur Text ausgeben lässt.

Als Zusatz gibt es noch so genannte Speechcon , mit diesen kann man Alexa noch mehr Sonderheiten beibringen. Habe ich selber aber noch nicht genutzt und bin ehrlich gesagt auch überfragt ob das zur Zeit schon mit dem Patami Framework nutzbar ist, bzw. ob da schon eine Methode für existiert.

1000 Dank Fonzo für die ausführlichen Antworten !!!

Jetzt habe ich material zum arbeiten :slight_smile:

Wird ne lange Nacht :slight_smile:

LG
Sascha

Viel Spass, kannst ja Dein Endergebniss teilen wenn Du willst.

oops…da muß ich nochmal fragen, bevor es richtig losgeht…

Ich habe im Script nun einen switch case in einen anderen verschachtelt.
War das so richtig ?

Ich will ja erst das Zimmer wissen, und dann die Lichtszene.

Leider sagt die gute Alexa immer, das script wäre ungültig…das habe ich nun schon mehrfach umgebaut, leider ohne Erfolg.

Sehe ich das richtig, daß die ID das ist, was Alexa übermittelt ? Also bei den slots hört Alexa auf „Rot Blau“ und die ID habe ich mit „rotblau“ gesetzt.

Hier mal mein Script:
Danke für die Hilfe :slight_smile:

<?
function Execute(Request $request)
{
    if($request->IsLaunchRequest())
    {
        $text = 'Dies war der Launch Intent von Lichtstimmung Du kannst mit mir Farben von Lampen einstellen';
    }
    
    $room = strtolower($request->slots->Zimmer);
    $colorscene = strtolower($request->slots->szenen);
    if ($room != "" && $colorscene != "")
    {
        // Set Device
        // your command
        switch ($room)
        {
        case 'wohnzimmer':
		  
            switch ($szene)
			{
			case 'allesaus':
			return TellResponse::CreatePlainText("alles aus erkannt");
			break;
			
			case 'rotblau':
			return TellResponse::CreatePlainText("Rot Blau erkannt");
			break;
			}
			break;
			
			
			
			
			
			
        case 'schlafzimmer':
            // set device bed room
            
            break;
        default:
            // The subject slot was invalid
            // Ask the user for the correct object type
            return AskResponse::CreatePlainText(
                'Diesen Raum kenne ich nicht. Zu welchem Raum wolltest Du Informationen haben?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
        }
        // Response
        $text = "Ich habe im ".$room." die Stimmung ".$colorscene." eingestellt"; 
    }
    else
    {
        $text = "Ich konnte den Raum ".$room." oder die Farbe ".$colorscene." leider nicht verstehen.";
    }
    
    
    //return TellResponse::CreatePlainText($text);
}

Auf den ersten Blick führst Du ein switch auf $szene aus diese Variable ist aber gar nicht definiert, ich denke Du meinst $colorscene