Patami Alexa Skill Framework

Hallo,

Danke für die tolle Arbeit. Lieft am Anfang auch gut.

Jetzt geht es (Alexa) nicht mehr. In den Instanzen steht jetzt an unterschiedlichsten Stellen „Unable to load tranlations“.
Z.B. in der Kern INstanz


Ich hab schon alles deinstalliert und neu eingerichtet, ändert nichts. Hab zwischenzeitlich 4.3 (testing) installiert, kann es daran liegen?

hardlog

Hm. Schalte bitte mal auf die „test“ Branch um und probiere es erneut.
Ist das Problem jetzt weg?

Hi,

was meinst Du mit „test Branch“.

Gruß
hardlog

Sorry habs gefunden. Teste gerade:
Zeigt es jetzt wieder korrekt an, den rest test ich gerade

Danke
hardlog

Dort, wo du das Modul installierst gibt es die Einstellung, die du suchst ;).

Danke,

bekomme aber immer noch keine Verbindung vom Alexa nach IPS.
Das Amazon-Developer-Portal meldet nach einem teststring (simmulator) immer:
„There was an error calling the remote endpoint, which returned HTTP 404 : Not Found“
In der Alexa Cumston Skill-INstanz stehlt mit Ausrufezeichen: „Die LaunchRequest Instanz ist nicht mit diesem Webhook verbunden“
Es ging anfangs mal.

hardlog

Hab alles nochmal geslöscht und neu eingerichtet.
Jetzt gehts.

Danke
hardlog

Geht schon super.

Meine Frage, ob ich mehr als ein slot-type über ein intend übertragen kann?
D.h. ich möchte folgenden Satz an IPS übermitteln:

„Alexa, sage sonos radio ffh“

Bis „Alexa sage sonos radio“ bekomme ich es hin. (sonos ist der intend und radio der slottype) Aber wie komme ich an das dahinter (hier „ffh“)?

Gruß
hardlog

Du kannst jedem Intent mehrere Intentslots zuweisen z.B.

im {rooms} {command} {radiostation} wiedergeben

{room} fragt Dir den Raumnamen ab
{command} wäre in dem Fall radio
{radiostation} ist der Sender z.B. ffh

Du würdest in dem Fall also sagen bei einem Invocationname Sonos
Alexa sage Sonos im Wohnzimmer Radio FFH wiedergeben

Die Intentslots wertest Du dann in IPS aus z.B.


<?
use Patami\IPS\System\IPS;

function Execute(Request $request)
{
	
	$room = strtolower($request->slots->rooms);
	$radiostation = strtolower($request->slots->radiostation);
	$device = strtolower($request->slots->device);
	$command = strtolower($request->slots->command);
	$volume = strtolower($request->slots->volume);
	$time = strtolower($request->slots->time);
	$balance = strtolower($request->slots->balance);
	
	if($request->IsLaunchRequest())
	{
		$text = 'Dies war der Launch Intent von Sonos';
	}
	if($room != "")
	{
			// Get the requested information
    switch ($room) {
        case 'bad':
        case 'badezimmer':
			$sonosid = 28677 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/;
			if($radiostation != "")
			{
				$text = SendSonosCommand($sonosid, $command, $radiostation);
			}
			else
			{
				$text = SendSonosCommand($sonosid, $command);
			}						
            break;
        case 'wohnzimmer':
			$sonosid = 20272 /*[Geräte\Heimkino\Audio\Sonos\Sonos Wohnzimmer]*/;
			if($radiostation != "")
			{
				$text = SendSonosCommand($sonosid, $command, $radiostation);
			}
			else
			{
				$text = SendSonosCommand($sonosid, $command);
			}
            break;
        case 'schlafzimmer':
			$sonosid = 19397 /*[Geräte\Heimkino\Audio\Sonos\Sonos Schlafzimmer]*/;
			if($radiostation != "")
			{
				$text = SendSonosCommand($sonosid, $command, $radiostation);
			}
			else
			{
				$text = SendSonosCommand($sonosid, $command);
			}
            break;
        case 'küche':
		case 'kueche':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			if($radiostation != "")
			{
				$text = SendSonosCommand($sonosid, $command, $radiostation);
			}
			else
			{
				$text = SendSonosCommand($sonosid, $command);
			}
            break;
        case '':
            // The subject slot was not set
            // Ask the user for the object type
            return AskResponse::CreatePlainText(
                'Hallo. Ich kann Deine Sonos Boxen steuern. Für weitere Informationen sage Hilfe. Welchen Raum möchtest Du steuern?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
        default:
            // The subject slot was invalid
            // Ask the user for the correct object type
            return AskResponse::CreatePlainText(
                'Diesen Raum kenne ich nicht. In welchem Raum wolltest Du Musik abspielen?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
    }
	}
	elseif($device != "")
	{
			// Get the requested information
    switch ($device) {
        case 'sonos':
        	$sonosid = 28677 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/;
			$text = SendSonosCommand($sonosid, $command);						
            break;
        case 'connect':
			$sonosid = 20272 /*[Geräte\Heimkino\Audio\Sonos\Sonos Wohnzimmer]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
        case 'connect amp':
			$sonosid = 19397 /*[Geräte\Heimkino\Audio\Sonos\Sonos Schlafzimmer]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
        case 'sub':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
		case 'soundbar':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
		case 'playbar':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
		case 'play fuenf':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
		case 'play drei':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;
		case 'play eins':
		case 'play 1':
            $sonosid = 33902 /*[Geräte\Heimkino\Audio\Sonos\Sonos Kueche]*/;
			$text = SendSonosCommand($sonosid, $command);
            break;						
        case '':
            // The subject slot was not set
            // Ask the user for the object type
            return AskResponse::CreatePlainText(
                'Hallo. Ich kann Deine Sonos Boxen steuern. Für weitere Informationen sage Hilfe. Welchen Raum möchtest Du steuern?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
        default:
            // The subject slot was invalid
            // Ask the user for the correct object type
            return AskResponse::CreatePlainText(
                'Diesen Raum kenne ich nicht. In welchem Raum wolltest Du Musik abspielen?'
            )->SetRepromptPlainText(
                'Wie bitte?'
            );
    }
	}  

     
    // Tell the user the requested number of objects
    return TellResponse::CreatePlainText(
        $text
    )->SetSimpleCard(
        'IP-Symcon Informationen',
        $text
    ); 
	
}


function SendSonosCommand($sonosid, $command, $radio = Null, $volume = Null)
{
	if ($command == "starten" || $command == "start")
				{
				SNS_Play($sonosid); 
                $text = sprintf(' %s wurde gestartet.', IPS_GetName($sonosid));
				}
			elseif ($command == "stoppen" || $command == "stopp")
				{
				SNS_Stop($sonosid);
				$text = sprintf(' %s wurde gestoppt.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "stumm schalten" || $command == "mute on")
				{
				SNS_SetMute($sonosid, true);
				$text = sprintf(' %s wurde stumm geschaltet.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "mute off")
				{
				SNS_SetMute($sonosid, false);
				$text = sprintf(' %s der Ton wurde wieder eingeschaltet.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "weiter")
				{
				SNS_Next($sonosid);
				$text = sprintf(' Es wurde auf %s zum nächsten Track gesprungen.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "zurück")
				{
				SNS_Previous($sonosid);
				$text = sprintf(' Es wurde auf %s zum vorherigen Track gesprungen.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "volume" || $command == "lautstärke")
				{
				SNS_ChangeVolume($sonosid, $volume);
				$text = sprintf(' Die Lautstärke aus %s wurde auf %s eingestellt.', IPS_GetName($sonosid), $volume); 
                }
			elseif ($command == "pause")
				{
				SNS_Pause($sonosid);
				$text = sprintf(' %s wurde gestoppt.', IPS_GetName($sonosid)); 
                }		
			elseif ($command == "radio")
				{
				SNS_SetRadio($sonosid, $radio);
				$text = sprintf(' Auf %s wurde der Radiosender %s gestartet.', IPS_GetName($sonosid), $radio); 
                }	
			/*	
			elseif ($command == "volume" || $command == "lautstärke")
				{
				SNS_ChangeVolume($sonosid, $volume);
				$text = sprintf(' Die Lautstärke aus %s wurde auf '.$volume.' eingestellt.', IPS_GetName($sonosid)); 
                }	
			*/	
			elseif ($command == "löschen")
				{
				//Bricht den Sleeptimer ab.
				SNS_DeleteSleepTimer($sonosid);
				$text = sprintf(' Der Sleeptimer von %s wurde abgebrochen.', IPS_GetName($sonosid)); 
                }
			elseif (($command == "ramp") && ($rampType == 1 || $rampType == "schlafen"))
				{
				$rampType = "SLEEP_TIMER_RAMP_TYPE";
				SNS_RampToVolume($sonosid, $rampType, $volume);
				$text = sprintf(' Die Lautstärke aus %s wurde auf '.$volume.' eingestellt.', IPS_GetName($sonosid)); 
                }
			elseif (($command == "ramp") && ($rampType == 2 || $rampType == "alarm"))
				{
				$rampType = "ALARM_RAMP_TYPE";
				SNS_RampToVolume($sonosid, $rampType, $volume);
				$text = sprintf(' Die Lautstärke aus %s wurde auf '.$volume.' eingestellt.', IPS_GetName($sonosid)); 
                }
			elseif (($command == "ramp") && ($rampType == 3 || $rampType == "alarm"))
				{
				$rampType = "AUTOPLAY_RAMP_TYPE";
				SNS_RampToVolume($sonosid, $rampType, $volume);
				$text = sprintf(' Die Lautstärke aus %s wurde auf '.$volume.' eingestellt.', IPS_GetName($sonosid)); 
                }			
			elseif ($command == "analog input")
				{
				SNS_SetAnalogInput($sonosid, $sonosid);
				$text = sprintf(' Die analoge Input von %s wurde eingestellt.', IPS_GetName($sonosid)); 
                }	
			elseif ($command == "balance")
				{
				// Passt die Balance Einstellungen im Equalizer der Sonos Instanz an. Nur Sinnvoll bei Setreopaaren oder AMPS.
				// Mögliche Werte liegen zwischen -100 (ganz links) und 100 (ganz rechts).
				SNS_SetBalance($sonosid, $balance);
				$text = sprintf(' Die Balance wurde von %s wurde auf '.$balance.' eingestellt.', IPS_GetName($sonosid)); 
                }					
			elseif ($command == "bass")
				{
				//Passt die Bass Einstellungen im Equalizer der Sonos Instanz an.
				//Mögliche Werte liegen zwischen -10 und 10.
				SNS_SetBass($sonosid, $bass);
				$text = sprintf(' Der Bass von %s wurde auf '.$bass.' eingestellt.', IPS_GetName($sonosid)); 
                }	
			elseif ($command == "crossfade ein")
				{
				//Schaltet den Crossfade Modus für eine Instanz ein oder aus.
				//Falls die Instanz Teil einer Gruppe ist, wird das Kommano automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetCrossfade($sonosid, true);
				$text = sprintf(' Der Crosfade von %s wurde eingestellt.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "crossfade aus")
				{
				//Schaltet den Crossfade Modus für eine Instanz ein oder aus.
				//Falls die Instanz Teil einer Gruppe ist, wird das Kommano automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetCrossfade($sonosid, false);
				$text = sprintf(' Der Crossfade von %s wurde ausgestellt.', IPS_GetName($sonosid)); 
                }		
			elseif ($command == "gruppieren")
				{
				//Fügt die Instanz zu einer Gruppe hinzu oder entfernt es aus einer Gruppe.
				//Wenn die InstanzID eines Gruppenkoordinators mitgegeben wird, wird die instanz dieser Gruppe hinzugefügt.
				//Wenn 0 mitgegeben wird, wird die Instanz aus allen Gruppen entfernt.
				SNS_SetGroup($sonosid, $groupCoordinator);
				$text = sprintf(' Die Lautstärke aus %s wurde auf '.$volume.' eingestellt.', IPS_GetName($sonosid)); 
                }	
			elseif ($command == "loudness ausschalten")
				{
				//Setzt das Loundess Flag an einer Instanz.
				SNS_SetLoudness($sonosid, false);
				$text = sprintf(' Die Loudness von %s wurde auf ausgeschaltet.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "loudness einschalten")
				{
				//Setzt das Loundess Flag an einer Instanz.
				SNS_SetLoudness($sonosid, false);
				$text = sprintf(' Die Loudness von %s wurde auf eingeschaltet.', IPS_GetName($sonosid)); 
                }			
			elseif ($command == "playlist")
				{
				//Entfernt alle Titel aus einer Queue und fügt alle Titel einer Playliste hinzu.
				//Der Name der Playliste muss in Sonos bekannt sein.
				//Es wird zunächst nach dem Namen in den gespeicherten Playlisten gesucht. Wird er dort nciht gefunden, wird ebenfalls in den Importierten Playlisten gesucht. Dabei wird ein Unterstrich ("_") such ein Leerzeichen (" ") ersetzt und die Endungen ".m3u" und ".M3U" werden entfernt. Somit kann z.B. die Playliste mit dem Name "3_Doors_Down.m3u" mit dem Befehl SNS_SetPlaylist(12345,"3 Doors Down"); gestartet werden.
				SNS_SetPlaylist($sonosid, $name);
				$text = sprintf(' Es wurde die Playliste %s zu %s hinzugefügt.', $name, IPS_GetName($sonosid)); 
                }	
			elseif ($command == "normal")
				{
				//Setzt den Play Mode einer Sonos Instanz.
				//Falls die Instanz Mitglied einer Gruppe ist, wird das Kommando automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetPlaymode($sonosid, 0);
				$text = sprintf(' Es wurde der Playmode von %s auf normal eingestellt.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "alles wiederholen")
				{
				//Setzt den Play Mode einer Sonos Instanz.
				//Falls die Instanz Mitglied einer Gruppe ist, wird das Kommando automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetPlaymode($sonosid, 1);
				$text = sprintf(' Es wurde der Playmode von %s auf alles wiederholen eingestellt.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "einmal wiederholen")
				{
				//Setzt den Play Mode einer Sonos Instanz.
				//Falls die Instanz Mitglied einer Gruppe ist, wird das Kommando automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetPlaymode($sonosid, 2);
				$text = sprintf(' Es wurde der Playmode von %s auf einmal wiederholen eingestellt.', IPS_GetName($sonosid)); 
                }
			elseif ($command == "shuffle keine wiederholung")
				{
				//Setzt den Play Mode einer Sonos Instanz.
				//Falls die Instanz Mitglied einer Gruppe ist, wird das Kommando automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetPlaymode($sonosid, 3);
				$text = sprintf(' Es wurde der Playmode von %s auf Shuffle keine Wiederholung eingestellt.', IPS_GetName($sonosid)); 
                }	
			elseif ($command == "shuffle")
				{
				//Setzt den Play Mode einer Sonos Instanz.
				//Falls die Instanz Mitglied einer Gruppe ist, wird das Kommando automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetPlaymode($sonosid, 4);
				$text = sprintf(' Es wurde der Playmode von %s auf Shuffle eingestellt.', IPS_GetName($sonosid)); 
                }						
			elseif ($command == "shuffle einmal wiederholen")
				{
				//Setzt den Play Mode einer Sonos Instanz.
				//Falls die Instanz Mitglied einer Gruppe ist, wird das Kommando automatisch an den Gruppenkoordinator weitergeleitet.
				SNS_SetPlaymode($sonosid, 5);
				$text = sprintf(' Es wurde der Playmode von %s auf Shuffle einmal Wiederholen eingestellt.', IPS_GetName($sonosid)); 
                }	
			elseif ($command == "sleeptimer")
				{
				//Setzt den Sleeptimer auf die angegebene Anzahl an Minuten.
				//Sollte das Kommando auf einem Gruppenmember ausgeführt werden, wird es automatisch an den zuständigen Koordinator weitergeleitet und gilt somit für die ganze Gruppe.
				SNS_SetSleepTimer($sonosid, $minutes);
				$text = sprintf(' Es wurde der Sleeptimer von %s auf %s Minuten eingestellt.', IPS_GetName($sonosid), $minutes); 
                }		
			elseif ($command == "s. p. dif")
				{
				//Selektiert den SPDIF Input einer Instanz als Audioquelle.
				SNS_SetSpdifInput($sonosid, $sonosid);
				$text = sprintf(' Es wurde der SPDIF von %s als Input ausgewählt.', IPS_GetName($sonosid)); 
                }	
			elseif ($command == "höhen")
				{
				//Passt die Treble Einstellungen im Equalizer der Sonos Instanz an. Mögliche Werte liegen zwischen -10 und 10.
				SNS_SetTreble($sonosid, $treble);
				$text = sprintf(' Es wurden die Höhen von %s auf %s eingestellt.', IPS_GetName($sonosid), $treble); 
                }		
		return $text;		
}

function GetSonosVolume($sonosid)
	{
		 $sonosresponse = SNS_alexaResponse($sonosid);
		 $volume = $sonosresponse["Volume"];
		 return $volume;
	}
	
	
	function GetTrackInfo($sonosid)
	{
		$sonosresponse = SNS_alexaResponse($sonosid);
		 $Album = $sonosresponse["Album"];
		 $Title = $sonosresponse["Title"];
		 $Artist = $sonosresponse["Artist"];
		 $TrackDuration = $sonosresponse["TrackDuration"];
		 $Position = $sonosresponse["Position"];
		 $nowPlaying = $sonosresponse["nowPlaying"];
		  
		 $trackinfo = $Album."
".$Artist."
".$Title."
".$Position."    ".$TrackDuration;	
		 return $trackinfo;
	}

cool, tausend Danke !!

Gruß
hardlog

Ich habe eben Version 3.3 veröffentlicht, die mit IPS 4.3 kompatibel ist.

Hallo
Hab das Framework erstmalig heute bei mir installiert.
Hab die IPS 4.3. Angezeigt wird mir dann als Framwork Version 3.2 vom 01.07.2017 15:33:55.
Ist das ein anderer Branch fuer die 3.3 ?
Ausserdem wurde mein Log sofort von unzaehligen Fehlermeldungen ueberhaeuft.
Ich benutze oft die Funktion

IPSUtil_ObjectIDByPath
13:16:06 | 00000 | CUSTOM  | PHP Error            | Type: E_WARNING
Message: Objekt mit Ident Watchdog wurde nicht gefunden
File: C:\Program Files (x86)\IP-SYMCON\scripts\IPSLibrary\app\core\IPSUtils\IPSUtils.inc.php
Line: 64

Vielleicht sollte man „Unbehandelte PHP Fehler und Ausnahmen protokollieren“ nicht standardmaessig
an schalten.

MfG 1007

In der 3.3 ist ein kleiner Bug, die Versionsnummer in der library.json ist noch 3.2.
Das macht aber außer dem Anzeigefehler nichts aus.

Wegen der Anzeige der PHP Fehler: Darüber könnte man sich streiten :slight_smile: Es sind nunmal Fehler. Wenn’s Dich nervt, mach es aus, dann siehst Du die Fehler in IPSLibrary nicht mehr. Weg sind sie dann aber noch lange nicht.

Stimmt. Hab ich ja dann gemacht nachdem ich die Fehlerflut mir angesehen habe.
Aber… Moechte jetzt keine Grundsachdiskussion beginnen…
Jeder der in einem Script eine Funktion mit Fehler mit einem „Klammeraffen“ abfaengt , wird eine
Fehlermeldung bekommen.
Man sollte mal darauf hinweisen. :wink:

MfG

Jemand eine Idee was hier die Ursache sein kann?

Hast Du mehr als eine Framework Kern Instanz angelegt?
Wann tritt der Fehler auf?

Muss ich fragen der Fehler tritt nicht bei mir auf.

Der von Fonzo geschilderte Fehler tritt auf, wenn ich die Instanz anlegen möchte. Ich gehe gemäß Anleitung vor, füge also die Bibliothek in Modules hinzu (Bitbucket) Dies funktioniert soweit. Sobald ich dann aber in den Kerninstanzen eine Instanz hinzufügen möchte, kommt nach Auswahl des PatamiFrameworks genau die besagte Meldung. Es wird aber ein Eintrag unter Kerninstanzen angelegt, aber ohne Namen und nicht aufrufbar, dann kommt ieder dieser Fehlereldung.

Merkwürdig. Welche IPS Version hast Du? Welches OS?
Wenn Du im IPS Logfile mal nach „ipspatami“ suchst, findest Du Einträge? Wenn ja, welche?

ich habe gerade von 4.1 auf 4.2 upgedated. Ändert aber nichts.
Im Log der Konsole finde ich nur eine Eintrag mit Creating… vom Versender Patami Framework.
Habe das Modul auch schon mehrfach entfernt.