Custom Skill erstellen

Guten Morgen,

ich bin gerade dabei einen Custom Skill für Alexa zu erstellen, und drehe mich irgendwie im Kreis. Folgendes Problem.
Zur Erstellung der „Alexa Custom Skill“ Instanz benötige ich die Skill Application ID und die User ID.
Die letzte finde ich nicht heraus.

In den Dokus steht, ich könne den Skill in der Developer-Oberfläche testen, was aber durch ein geändertes Frontend scheinbar (bei mir) nicht funktioniert.

Hat jemand einen Tipp für mich?

Edit: jetzt bin ich soweit, dass Alexa mir im Test antwortet, dass eine ungültige DeviceID übergeben wurde

Guten Morgen, ich dreh mich (sicher auch wegen der umfangreichen Dokus) im Kreis.
Ich bin zwar der Meinung alles beachtet zu haben, aber so recht klappen will es nicht. Hab aber den Verdacht, dass es nur eine Kleinigkeit ist, da IPS registriert, dass ich den echo dot anspreche:


Als Antwort kommt, egal was ich beim Aufruf des Skills (frage haus nach…), dass kein passender Content übegeben wurde.

Vielleich kennt jemand die Lösung oder kann mir einen Tip geben.

wieder einen kleinen Schritt weiter: ich habe einfach den falschen Namen in der „Alexa custom Skill intent“ Instanz eingetragen.

Jetzt lässt sich der intent aufrufen bzw. auch Skripte starten.

Was ich nicht hinbekomme, dass Alexa mir das eine Gegenfrage stellt bzw. mir Werte mitteilt. :banghead:

Wie sieht denn der Inhalt des Skripts aus das den Content zurück geben soll?

Hay fonzo,

hab schon gemerkt, dass in dem Standard Skript

<?
use Patami\IPS\System\IPS;
 
function Execute(Request $request)
{
    // Get the subject slot
    $subject = strtolower($request->slots->subject);
     
    // Get the requested information
    switch ($subject) {
        case 'objekte':
        case 'objekten':
            $text = sprintf('Es sind %d Objekte vorhanden.', IPS::GetObjectCount());
            break;
        case 'bibliothek':
        case 'bibliotheken':
            $text = sprintf('Es sind %d Bibliotheken vorhanden.', IPS::GetLibraryCount());
            break;
        case 'module':
        case 'modulen':
            $text = sprintf('Es sind %d Module vorhanden.', IPS::GetModuleCount());
            break;
        case 'instanzen':
            $text = sprintf('Es sind %d Instanzen vorhanden.', IPS::GetInstanceCount());
            break;
        case 'variablen':
            $text = sprintf('Es sind %d Variablen vorhanden.', IPS::GetVariableCount());
            break;
        case 'skripte':
        case 'skripten':
            $text = sprintf('Es sind %d Skripte vorhanden.', IPS::GetScriptCount());
            break;
        case 'funktionen':
            $text = sprintf('Es sind %d Funktionen vorhanden.', IPS::GetFunctionCount(0));
            break;
        case 'ereignisse':
        case 'ereignissen':
            $text = sprintf('Es sind %d Ereignisse vorhanden.', IPS::GetEventCount());
            break;
        case 'medien':
            $text = sprintf('Es sind %d Medien vorhanden.', IPS::GetMediaCount());
            break;
        case 'links':
            $text = sprintf('Es sind %d Links vorhanden.', IPS::GetLinkCount());
            break;
        case 'kategorien':
            $text = sprintf('Es sind %d Kategorien vorhanden.', IPS::GetCategoryCount());
            break;
        case '':
            // The subject slot was not set
            // Ask the user for the object type
            return AskResponse::CreatePlainText(
                'Ich kann Dir sagen wie viele Objekte unterschiedlicher Typen im System vorhanden sind. ' .
                'Zu welcher Art von Objekt willst Du Informationen haben?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            ); 
        default:
            // The subject slot was invalid
            // Ask the user for the correct object type
            return AskResponse::CreatePlainText(
                'Diese Objektart kenne ich nicht. Was meintest Du?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
    }
     
    // Tell the user the requested number of objects
    return TellResponse::CreatePlainText(
        $text
    )->SetSimpleCard(
        'IP-Symcon Informationen',
        $text
    );  
}

die Systemvariablen vom Framework angesprochen werden. Mittlerweile teilt mir Alexa auch die Werte mit. Da kann ich doch bestimmt eigene Variablen aus IPS abgreifen, oder? (in Amazon developer Oberfläche ist mir das schon deutlich und angepasst)

Wenn ich eine integer Variable mit ID 50518 habe, die die verbleibenden Tage enthält, wann der Müll abgeholt wird, fehlt mir die korrekte Zeile:
$text = sprintf(‚Es sind %d Tage bis dein blöder Müll abgeholt wird.‘, 50518); :frowning:

und die Integration im Skript, dass ich einen weiteren intent aufrufen kann:confused:


$text = sprintf('Es sind %d Tage bis dein blöder Müll abgeholt wird.',  GetValueFormatted(50518));

Siehe bei mir z.B. so aus hängt ja aber vom interaction Modell ab was Du Dir zurecht gebastelt hast.


<?
use Patami\IPS\System\IPS;

function Execute(Request $request)
{
	$subject = strtolower($request->slots->subject);
	
	// Get the requested information
    switch ($subject)
	{
        case 'oeffnungszeiten': // ISSUE UMlaute werden nicht erkannt
			$open = GetValue(22869 /*[Geräte\Amazon Echo Alexa\Alexa Müllabfuhr\Bauhof Öffnungszeiten]*/);
			$text = "Die Öffnungszeiten des bauhofs sind ".$open;
			$simplecardtext = $text;				
            break;
        case 'termine':
			$Garbageinfo = GetGarbageInfo();
			if($Garbageinfo == false)
			{
				$text = ' Es wurde kein konfiguriertes Müllabfuhrmodul in IP-Symcon gefunden. Installiere bitte erst ein passendes Modul um nach Müllabfuhrterminen fragen zu können.';
				$simplecardtext = $text; 
			}
			else
			{
				$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s.', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				$simplecardtext = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s.', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				$text .= sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s.', $Garbageinfo["PapierMuellTage"], $Garbageinfo["PapierMuellDatum"]);
				$simplecardtext = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s.', $Garbageinfo["PapierMuellTage"], $Garbageinfo["PapierMuellDatum"]);
				//$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s. 
', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				//$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s. 
', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				//$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s. 
', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				//$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s. 
', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				//$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s. 
', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
				//$text = sprintf(' Der nächste Restmülltermin ist in %s Tagen am %s. 
', $Garbageinfo["RestMuellTage"], $Garbageinfo["RestMuellDatum"]);
			}
            break;
        case '':
            // The subject slot was not set
            // Ask the user for the object type
            return AskResponse::CreatePlainText(
                'Hallo. Ich habe Dich leider nicht verstanden. Du kannst nach Öffnungszeiten oder Termine fragen. Was willst Du wissen?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
        default:
            // The subject slot was invalid
            // Ask the user for the correct object type
            return AskResponse::CreatePlainText(
                'Hallo. Ich habe Dich leider nicht verstanden. Du kannst nach Öffnungszeiten oder Termine fragen. Was willst Du wissen?Ich kann Dir die nächsten Termine der Müllabfuhr oder die Öffnungszeiten des Bauhofs nennen. Zu was willst Du Informationen haben?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
    }
	
	
	return AskResponse::CreatePlainText(
                    $text
                )->SetRepromptPlainText(
                    'Was hast Du gesagt?'
                )->SetSimpleCard(
        'Müllabfuhr Informationen',
        $simplecardtext
    );
}

function GetGarbageInfo()
	{
		$GarbageID = IPS_GetInstanceListByModuleID("{5807CF27-8E92-4386-B185-7894D351F3B7}")[0]; // Bayaro Müllabfuhr
		if($GarbageID > 0)
		{
			$Garbageinfo = AlexaGarbageResponse($GarbageID);
		}
		else
		{
			$Garbageinfo = false;
		}
		return $Garbageinfo;
	}

function AlexaGarbageResponse($GarbageID)
{
	$leerungheute = GetValueFormatted(IPS_GetObjectIDByIdent("MuellXLeerungHeute", $GarbageID)); // Leerung Heute
	$leerungmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("MuellXLeerungMorgen", $GarbageID)); // Leerung Morgen
	$restmuellheute = GetValueFormatted(IPS_GetObjectIDByIdent("Muell1LeerungHeute", $GarbageID)); // Restmüll Leerung Heute
	$restmuellmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("Muell1LeerungMorgen", $GarbageID)); // Restmüll Leerung Morgen
	$restmuelldatum = GetValue(IPS_GetObjectIDByIdent("Muell1LeerungNaechsteAm", $GarbageID)); // Restmüll Leerung nächste am
	$restmuelltage = GetValue(IPS_GetObjectIDByIdent("Muell1LeerungInTagen", $GarbageID)); // Restmüll Leerung in X Tagen
	$papiermuellheute = GetValueFormatted(IPS_GetObjectIDByIdent("Muell2LeerungHeute", $GarbageID)); // Papiermüll Leerung Heute
	$papiermuellmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("Muell2LeerungMorgen", $GarbageID)); // Papiermüll Leerung Morgen
	$papiermuelldatum = GetValue(IPS_GetObjectIDByIdent("Muell2LeerungNaechsteAm", $GarbageID)); // Papiermüll Leerung nächste am
	$papiermuelltage = GetValue(IPS_GetObjectIDByIdent("Muell2LeerungInTagen", $GarbageID)); // Papiermüll Leerung in X Tagen
	$biomuellheute = GetValueFormatted(IPS_GetObjectIDByIdent("Muell3LeerungHeute", $GarbageID)); // Biomüll Leerung Heute
	$biomuellmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("Muell3LeerungMorgen", $GarbageID)); // Biomüll Leerung Morgen
	$biomuelldatum = GetValue(IPS_GetObjectIDByIdent("Muell3LeerungNaechsteAm", $GarbageID)); // Biomüll Leerung nächste am
	$biomuelltage = GetValue(IPS_GetObjectIDByIdent("Muell3LeerungInTagen", $GarbageID)); // Biomüll Leerung in X Tagen
	$recylingmuellheute = GetValueFormatted(IPS_GetObjectIDByIdent("Muell4LeerungHeute", $GarbageID)); // Recylingmüll Leerung Heute
	$recylingmuellmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("Muell4LeerungMorgen", $GarbageID)); // Recylingmüll Leerung Morgen
	$recylingmuelldatum = GetValue(IPS_GetObjectIDByIdent("Muell4LeerungNaechsteAm", $GarbageID)); // Recylingmüll Leerung nächste am
	$recylingmuelltage = GetValue(IPS_GetObjectIDByIdent("Muell4LeerungInTagen", $GarbageID)); // Recylingmüll Leerung in X Tagen
	$sondermuellheute = GetValueFormatted(IPS_GetObjectIDByIdent("Muell5LeerungHeute", $GarbageID)); // Sondermüll Leerung Heute
	$sondermuellmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("Muell5LeerungMorgen", $GarbageID)); // Sondermüll Leerung Morgen
	$sondermuelldatum = GetValue(IPS_GetObjectIDByIdent("Muell5LeerungNaechsteAm", $GarbageID)); // Sondermüll Leerung nächste am
	$sondermuelltage = GetValue(IPS_GetObjectIDByIdent("Muell5LeerungInTagen", $GarbageID)); // Sondermüll Leerung in X Tagen
	$sperrmuellheute = GetValueFormatted(IPS_GetObjectIDByIdent("Muell6LeerungHeute", $GarbageID)); // Sperrmüll Leerung Heute
	$sperrmuellmorgen = GetValueFormatted(IPS_GetObjectIDByIdent("Muell6LeerungMorgen", $GarbageID)); // Sperrmüll Leerung Morgen
	$sperrmuelldatum = GetValue(IPS_GetObjectIDByIdent("Muell6LeerungNaechsteAm", $GarbageID)); // Sperrmüll Leerung nächste am
	$sperrmuelltage = GetValue(IPS_GetObjectIDByIdent("Muell6LeerungInTagen", $GarbageID)); // Sperrmüll Leerung in X Tagen
	$garbage = array ("MuellXLeerungHeute" => $leerungheute, "MuellXLeerungMorgen" => $leerungmorgen, "RestMuellHeute" => $restmuellheute, "RestMuellMorgen" => $restmuellmorgen, "RestMuellDatum" => $restmuelldatum, "RestMuellTage" => $restmuelltage, "PapierMuellHeute" => $papiermuellheute, "PapierMuellMorgen" => $papiermuellmorgen, "PapierMuellDatum" => $papiermuelldatum, "PapierMuellTage" => $papiermuelltage,
	"BioMuellHeute" => $biomuellheute, "BiomuellMuellMorgen" => $biomuellmorgen, "BioMuellDatum" => $biomuelldatum, "BioMuellTage" => $biomuelltage, "RecylingMuellHeute" => $recylingmuellheute, "RecylingMuellMorgen" => $recylingmuellmorgen, "RecylingMuellDatum" => $recylingmuelldatum, "RecylingMuellTage" => $recylingmuelltage,
	"SonderMuellHeute" => $sondermuellheute, "SonderMuellMorgen" => $sondermuellmorgen, "SonderMuellDatum" => $sondermuelldatum, "SonderMuellTage" => $sondermuelltage, "SperrMuellHeute" => $sperrmuellheute, "SperrMuellMorgen" => $sperrmuellmorgen, "SperrMuellDatum" => $sperrmuelldatum, "SperrMuellTage" => $sperrmuelltage);
	return $garbage;
}

danke, das hat mir schon geholfen. Damit kann ich schon einiges anfangen.
Gibt es auch die Möglichkeit eine boolean variable anzusprechen?

Variable Fensterstatus ist „true“ und steht durch das Profil auf „geschlossen“. Alexa sollte mir antworten, dass „geschlossen“ ist.

Habs quick & dirty mit Hilfe deines Skripts:

		case 'Fenster':
            $status = GetValue(21443);
                if($status == false) 
                    {
                    $text = ' Eins'; 
                    $simplecardtext = $text;  
                    }
                else
                    {
                    $text = ' Fenster offen '; 
                    $simplecardtext = $text;  
                    }
                break;

dann finde ich die Funktion, wie ich Alexa zum nachfragen bekomme, sicher auch noch raus.

GetValueFormatted gibt Dir das passende Variablenprofil zurück, das dann vorgelesen wird.

Hey Fonzo,

ich habe eine Float-Variable mit dem Wert „1,18 €“. Alexa antwortet mir auf die Zeile im Skript:

$text = sprintf('es kostet %d Euro',  GetValueFormatted(41142))

„Es kostet 1 Euro“

Warum kennt Alexa die Komma nicht?

Wie sieht das Profil der Variablen aus? Hast du vielleicht 0 Nachkommastellen eingestellt?

Daran sollte es nicht liegen:

tanken.JPG

Probier es einfach mal mit %f anstatt %d

Gesendet von iPad mit Tapatalk

probiert, aber nicht geholfen. Alexa antwortet:

„…Kostet 1,00000000 Euro.“

Kostet aber 1,24 Euro

GetValueFormatted liefert einen String!
Also %s, bei GetValue wäre %f korrekt, aber dann fehlt das Euro im Text.
Michael

mit %s sagt Alexa:

„…kostet 1 Eur und 24 Cent.“ - so soll es ein.

Danke Michael.

Gibt es irgendwo eine Übersicht welche Variable wie verwendet werden sollte - bins bisher erfolglos am suchen.

PHP Doku:
PHP: sprintf - Manual
Michael

[emoji106] danke