Patami Alexa Skill Framework

Hallo Fonzo,

Ja es wird das alte Problem sein. Es ist auf Deutsch gestellt. Ich komme da einfach nicht weiter. Hier noch das Script.

<?
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
    );  
}]

Hi Fonzo ja du hast recht. Der Fehler wird von einem fehlendem „else“ fabriziert. Ich habe die Abfragen jetzt mit einem else beendet und siehe da, die Anfragen werden zu 100% mit meiner definierten Antwort beendet wenn es zu keinem Match kommt. Jetzt muss ich mir heute Abend mal das Interaction Modell vorknöpfen um zu sehen wo der Fehler liegt und warum die passenden Worte nicht raus gehen. Vielen Dank für die Hilfe !!

Hallo,
so habe mein Problem mit dem Fehler beim kopieren gefunden. Es lag am Browser. Edge hat die Probleme gemacht.
Jetzt gehen auch die Scripte die ich kopiert hatte auf anhieb.
Der Custom Skill funktioniert auch. Danke noch mal für die gute Anleitung. Jetzt kann es losgehen und einiges umzusetzen. Werden bestimmt noch einige Fragen kommen.

Habe mir letze Woche den Intents Temperatur zur abfragen der Garten und Wohnzimmer Temperatur angelegt. Hat auch gleich geklappt. Heute wollte ich das erweitern mit der Temperatur in der Küche, jetzt wird das Script bei der Küchentemperatur als ungültig bezeichnet. Die andern beiden Temperaturen laufen noch.
Das Script habe ich erweitert.

<? 
function Execute(Request $request) 
{ 
     
    $tempwohn   = GetValueFloat(19539 /*[Wohnzimmer\Temperatur\Wohnzimmertemperatur\WZ Temperatur]*/); 
    $tempküche   = GetValueFloat(42269 /*[Küche\Heizung\Regler Küche\Küchen Temperatur]*/); 
    $tempaussen = GetValueFloat(24281 /*[Aussen\Temperatur\Aussentemperatur\Aussen Temperatur]*/); 
     
     
    $sensor = strtolower($request->slots->sensoren); 
         
    if($sensor != "") 
            { 
                if ($sensor == "wohnzimmer") 
                { 
                $text = "Im Wohnzimmer beträgt die Temperatur".$tempwohn."grad"; 
                } 
                elseif ($sensor == "kueche") 
                { 
                $text = "In der Küche beträgt die Temperatur".$tempküche."grad"; 
                } 
                elseif ($sensor == "garten") 
                { 
                $text = "Im Garten beträgt die Temperatur".$tempaussen."grad"; 
                }   
                 
            } 
         
    // Tell the user  
    return TellResponse::CreatePlainText( 
        $text 
    )->SetSimpleCard( 
        'Modus IP-Symcon', 
        $text 
    );  
     
} 

und bei Amazon auch


Habe ich noch was vergessen?

Was kommt denn von Amazon an? Wahrscheinlich greift einfach die Bedingung nicht, das kann man aber erst sagen ,wenn man weis was Amazon sendet. Auffällig ist das Du im Interaktion Modell alles kleinschreibst, Alexa sollte die Dinge aber eigentlich schon so verstehen wie sie geschrieben werden. Daher würde ich das höchstens als Alias setzten aber Küche, Wohnzimmer usw. gehört im Interaktion Modell groß geschrieben.
Du hast auch keine else Bedingung, für den Fall das keines der Bedingungen greift, definiert. Dann ist $text nicht definiert das erzeugt dann definitiv einen Fehler.

Du hast auch keine else Bedingung, für den Fall das keines der Bedingungen greift, definiert. Dann ist $text nicht definiert das erzeugt dann definitiv einen Fehler.

Kannst du mir mal hierfür ein Beispiel zeigen!

Das bei Küche nichts kam, habe ich gefunden, hatte einen Schreibfehler im Script. Mit der Großschreibung werde ich noch anpassen.

Es fehlt einfach die else Bedingung am Schluss siehe if…elseif…else statement

Danke für den Link.

Hi,
ich weiß nicht ob ich ein grundlegendes Verständnisproblem habe oder mir nur der entscheidende Schritt fehlt.

Ich bin das Beispiel für den System Information Skill komplett durchgegangen bis auf den HelpIntent (brauche ich ja nicht zwangsläufig oder?). Im Test bereich auf der Developmentseite funktioniert es auch schon, ich bekomme die richtige Antwort angezeigt. Nun steht in der Anleitung ja nichts zum Bereich Publishing Information. Was muss ich nun weiter tun, um meinen Custom Skill auf meine Alexa zu bekommen, also wie bringe ich einen Custom Skill auf mein Echo Dot?

Gruß

Hi,
habe nochmal weiter überlegt, finde aber nirgendwo einen Hinweis. Muss ich mich in der Alexa App mit dem Developer Account statt dem normalen Account einloggen? Wenn ja habe ich das Problem, dass meine Mobilfunknummer bereits mit meinem Standard Amazon Account verknüpft ist, ich kann mich also garnichtmehr mit einem anderen Account einloggen? Oder bin ich immernoch komplett auf dem Holzweg?

Gruß

EDIT:
Erledigt! Für alle die vor der gleichen Frage stehen: Die Alexa App muss mit dem Developer Account verknüpft werden. Falls die Alexa App schon mit eurem Amazon Account verknüpft ist könnt ihr einen Developer Account mit dem gleichen Nutzernamen (E-Mail) und Passwort anlegen, so hat es bei mir dann problemlos geklappt!

Großen Dank für das Modul, das macht richtig Spaß!

Hallo,

Nachdem ich die Temperatur Abfragen erfolgreich eingebunden habe, noch eine Frage. Wie habt ihr es gelöst das Alexa die Temperatur mit 19,4 ansagt und nicht mit 19_4. Wie kann ich ihr das Komma beibringen?
Hört sich sonst komisch an.

Eigentlich musst Du Alexa nichts beibringen wenn Du ihr 19,4 übergibst, dann sagt sie das auch so an. Beim ,0 schluckt sie die Dezimalstelle, das ist aber auch gut so, dann sagt sieht also es hat 19 Grad und nicht 19,0 Grad.

Der Fehler liegt bei Dir wohl darin, dass Du gar kein Komma übergibst, dann kann Alexa auch kein Komma ansagen.

Also nicht:


$tempwohn   = GetValueFloat(19539 /*[Wohnzimmer\Temperatur\Wohnzimmertemperatur\WZ Temperatur]*/);  

sondern so richtig mit Komma:


$tempwohn   = str_replace(".", ",", strval(GetValueFloat(19539 /*[Wohnzimmer\Temperatur\Wohnzimmertemperatur\WZ Temperatur]*/)));

Noch einfacher ist es einfach über das passende VariablenProfil auszulesen.
Also am besten:


$tempwohn = GetValueFormatted(19539 /*[Wohnzimmer\Temperatur\Wohnzimmertemperatur\WZ Temperatur]*/);

und dann in der Ausgabe


 $text = "Im Wohnzimmer beträgt die Temperatur ".$tempwohn;  

Hallo Fonzo,

Danke für Deine Hilfe, hat wunderbar geklappt und habe gleich noch dazu gelernt.

Hallo,
zunächst vielen Dank für das Entwickeln und Bereitstellen des Moduls! :loveips:

Leider erhalte ich beim Hinzufügen des Moduls als Instanz bei den Kern Instanzen eine Fehlermeldung. Des Weiteren wird die Instanz nicht korrekt erstellt.

Woran könnte es scheitern?

P.S.: Ich nutze IPS 4.0 (06.10.2016)

Das Modul nutzt RegisterMessage und das geht erst ab IP-Symcon 4.1 in dem Fall ist also IP-Symcon zu alt für die Version des Moduls.

Ok, vielen Dank!
Seher schade… :banghead:

Geht leider nicht anders, da ab 4.0 noch wichtige Funktionen hinzugekommen sind, unter anderem auch List und es schier unmöglich ist eine Abwärtskompatibilität auf Dauer aufrecht zu erhalten. Mit einem Update läuft es aber bestimmt, ich persönlich finde das sehr praktisch das Modul. Muss aber jeder für sich entscheiden ob sich deshalb ein Update lohnt, aber auch andere Module setzten inzwischen min 4.1 oder 4.2 voraus wenn diese z.B. Listen nutzen.

Hallo,
ich habe eine Subskription gekauft und IPS aktualisiert. Die Modulinstallation funktionierte nun.

Na prima, im Skill musst Du als Default HTTPS auswählen und dort die IP-Symcon Connect Adresse bzw. eine URL eingeben unter der Dein IP-Symcon erreichbar ist.

Für IP-Symcon Connect wäre das:


https://<IP Symcon Connect Adresse>/hook/alexa/<Pfad>

Wenn man eine eigene URL hat mit SSL muss man diese selber wissen. Im Fall von IP-Symcon Connect kann man die Adresse auch nachschlagen.

Ein Skript mit


<?
$ipsymconconnectid = IPS_GetInstanceListByModuleID("{9486D575-BE8C-4ED8-B5B5-20930E26DE6F}")[0];
$connectinfo = CC_GetUrl($ipsymconconnectid); 
var_dump($connectinfo);
?>

gibt die IP-Symcon Connect Adresse aus, diese muss dann oben unter Default an Stelle von <IP Symcon Connect Adresse> eingetragen werden.
Der <Pfad> wird in der IO Instanz angegeben und dann unter Default entsprechend übernommen.

Vielen Dank auch für deine wirklich sehr detaillierte Anleitung auf braintower.de!!!

Wenn ich auf Amazon „Starte System Informationen“ eingebe, dann erhalte ich folgende Fehlermeldung:
„There was an error calling the remote endpoint, which returned HTTP 405 : Method not allowed“

Wenn ich zu Alexa „Starte System Informationen“ sage, erhalte ich folgende Antwort:
„Bei der Antwort des angefragten Skills ist ein Problem aufgetreten.“

Woran könnte es scheitern oder wie könnte ich das Problem eingrenzen?