Patami Alexa Skill Framework

Nö, hab ich nicht. Hast Du es auch mit dem Simulator getestet?

Ne über den Simulator gehts noch nicht.
Aber ohne Simulator sind die Anfragen bei mir ja auch nicht durchgekommen oder täusche ich mich… hatte ich schon meine scripts angepasst … grübel…
hmm ich glaub ich hab in den letzten Tag einfach zu viele verschiedenen Einstellungen getestet.

Auf jedefall bin ich mometan sehr zufrieden… und kann sagen das das alles flutscht

Der Master Branch ist nun auch auf 3.4.

Ich habe gerade das Patami Framework geladen und eine PatamiFramework Instanz angelegt. Seitdem bekomme ich beim Starten des IPS Dienstes folgende Fehlermeldung:

17:35:56 | 00000 | MESSAGE | PHPLibrary           | Registriere Funktion... Reflection parse error: <br />
<b>Notice</b>:  Constant IPS_BASE already defined in <b>C:\IP-Symcon\modules\SymconMisc\USBMapper\module.php</b> on line <b>2</b><br />
<br />
<b>Notice</b>:  Constant IPS_KERNELSTARTED already defined in <b>C:\IP-Symcon\modules\SymconMisc\USBMapper\module.php</b> on line <b>3</b><br />
{"FixPorts":{}}

Irgendetwas wird sicherlich nicht korrekt funktionieren …

Ich habe es hier mal gepostet, da die Installation des Frameworks der Auslöser war.

Kann mir da bitte jemand helfen?

Gruß

Burkhard

Der Fehler war sicher vorher schon da, Das Framework protokolliert Fehler die du vorher einfach nicht gesehen hast. Du kannst das in den Einstellungen ausschalten.

Der Fehler war vorher definitiv nicht da. Kann denn überhaupt ein ‚Reflection parse error‘ unterdrückt werden?

In den Einstellungen ist ‚Unbehandelte PHP Fehler und Ausnahmen‘ ausgeschaltet. Oder gibt es noch weitere Einstellmöglichkeiten?

Wenn ich nun versuche eine USBMapper Instanz anzulegen, bleibt die Konsole hängen … und nur ein Neustart des Systems hilft.

Edit:

Ich glaube ich habe das Problem gefunden. Im Framework werden die Variablen nur definiert, wenn sie noch nicht anderweitig definiert sind:

if (! defined('IPS_BASE')) {

    // --- BASE MESSAGE
    define('IPS_BASE', 10000);                             //Base Message

So weit gut.

Im USB Mapper Modul geschieht dies ohne Einschränkung:

define("IPS_BASE", 10000);

Da das Framework wohl zuerst geladen wird, hat das USB Mapper Modul in SymconMisc ein Problem …

Kann jemand den Thread verschieben?

Stimme zu das liegt dann eher am anderen Modul.

Hallo zusammen,

Ich habe in letzter Zeit immer wieder das Problem, wenn ich eine Anfrage an Alexa (Patami Skill) stelle, das die Dame mir Antwortet das ein Script Fehler vorliegt. Ich stelle danach genau die gleiche Frage und es geht auf einmal.

Wurde das Problem schon mal behandelt oder gibt es Leute die das bestätigen können ??? Das Problem tritt bei unterschiedlichsten Anfragen auf. Ich versuche das mal im Debug einzufangen.

Grüße Daniel

Bei mir ist das Problem nicht bekannt.
Im Debug des WebHooks sollten aber eventuelle Probleme sichtbar sein.
Evtl. noch das IPS Log auf „patami“ filtern und das auch noch posten.

Hallo,

danke für das tolle Modul. Funktioniert prima.

Seit der neuesten Version muss ich nach dem Aufruf eines Skripts immer „ein“ oder „aus“ hinterher schicken, was ja bei Skripts keinen Sinn macht.

Gruß, Hannes

Das verstehe ich nicht. Kannst Du ein konkreteres Beispiel geben und auch ein Debug Log posten?

So nach viel Lesen und Probieren hab ich den ersten Skill mit dem Echo und IPS hin bekommen. Da ich es nutzen will um einen Status zu ändern und mir bei zweien davon ausgeben lasse wieviele Fenster noch auf oder gekippt sind. Wollte ich drei Intensität anlegen um verschiedene Skripte zu triggern. Wenn ich das richtig sehe kann der IPS Skill aber immer nur einen Alexa Intention anstoßen. Wie kann ich es hin bekommen mehrere zu verknüpfen? Muss ich dann für jeden einen IPS Skill und einen Intention anlegen oder gibt es eine elegantere Möglichkeit?

Ach ja mit Variablen möchte ich nicht hantieren da ich z. B. „Sag System Gute Nacht“ oder „sag System Guten Morgen“ oder „sag System ich bin jetzt weg“ sagen möchte.

Gesendet von meinem SGP712 mit Tapatalk

Du musst einen Skill anlegen und pro Intent noch eine Intent Instanz. Alle diese Intent Instanzen verknüpfst Du mit der „übergeordneten“ Skill Instanz.

Aber in dem übergeordneten Skill kann ich doch nur einen Intent angeben oder übersehe ich da was?

Gesendet von meinem SGP712 mit Tapatalk

Du kannst im Interaction Modell so viele Intents anlegen wie Du willst und brauchst dann auf der Gegenseite in IPS auch einen entsprechende Intent Slot Instanz die das entgegennimmt. Allerdings ist es eigentlich unnötig so viele Intents zu nutzten Du hast ja Intent Slots zu verfügung und die kannst Du ja in Deinem Skript auswerten. Vielleicht gibt Du mal ein konkretes Beispiel was Du genau machen willst Dann kann man Dir von der Grundstruktur helfen.

Hier mal meine Idee. Ich hab vier Staus-Werte die ich setzen möchte „Anwesend“, „Schlafen“, „Abwesend“ und „Party“. Wenn ich „Abwesend“ oder „Schlafen“ auswähle soll der Echo mir sagen wie viele Fenster noch offen und gekippt sind. Das hab ich soweit hin bekommen für den Intent den ich Sleeping genannt habe. Jetzt möchte ich für die restlichen Staus-Werte auch jeweils ein Skript aufrufen (oder das in einem großen abhandeln).

Ich möchte jetzt für jeden Modus verschiedene Sätze sagen können. z.B. für:

Schlafen: „Gute Nacht“, „Setze auf Schlafmodus“, „Stelle Nachtbetrieb her“…

Anwesend: „Guten Morgen“, „Tagbetrieb“, „Setzte auf Tag“…

Abwesend: „Ich bin dann weg“, „Ich bin dann mal weg“, „Schließe ab“, „Bis später“…

Party: „Heute wird gefeiert“, „Wir haben Besuch“, „Aktiviere Partymodus“…

Wenn ich das richtig gelesen habe sind die Slots dafür da Variablen entgegen zu nehmen um die Sätze zu vervollständigen. Damit bin ich aber im Satzaufbau sehr beschränkt und könnte nicht solche Sachen bauen wie oben oder?

Beim IPS Alexa Custom Skill kann ich doch nur einen Intent aufrufen der unter „Diesen Intent ausführen, wenn der Skill ohne Kommando aufgerufen wird (LaunchRequest)“. In dem wiederum kann ich genau ein Skript eintragen, das ausgeführt wird wenn dieser Intent kommt. Deshalb erschließt sich mir auch die Trennung in Custom Skill und Skill Intent noch nicht so ganz.

Oder gibt es eine Möglichkeit (und ich hab sie nicht gefunden) wo man in dem Custom Skill je nach dem von Alexa gelieferten Intent andere Instanzen des Custom Skill Intents aufrufen kann?

Gesendet von meinem SGP712 mit Tapatalk

Du kannst ja grundsätzlich sagen was Du willst Du solltest nur einen oder auch mehrere Intent Slots nutzten um dann in Deinem Skript genau identifizieren zu können welcher Fall denn vorliegt.

Hier mal ein simples Beispiel das beliebig komplex gemacht werden kann eines Interaction Models. In Deinem Skill den Skill Builder Beta starten und dort den Code in den Editor kopieren dann siehst Du wie das aufgebaut ist und kannst weiter editieren.


{
  "intents": [
    {
      "name": "absense",
      "samples": [
        "Aktiviere {Mode} ",
        "Stelle {Mode} her",
        "Setzte auf {Mode}",
        "Guten {Command}",
        "Gute {Command}",
        "Ich bin dann {Command}",
        "Ich bin dann mal {Command}",
        "Schließe {Command}",
        "Bis {Command}",
        "Heute wird {Command} bis morgen früh",
        "Wir haben {Command}"
      ],
      "slots": [
        {
          "name": "Mode",
          "type": "mode",
          "samples": []
        },
        {
          "name": "Command",
          "type": "absense",
          "samples": []
        }
      ]
    },
    {
      "name": "AMAZON.CancelIntent",
      "samples": []
    },
    {
      "name": "AMAZON.HelpIntent",
      "samples": []
    },
    {
      "name": "AMAZON.StopIntent",
      "samples": []
    }
  ],
"types": [
    {
      "name": "absense",
      "values": [
        {
          "id": null,
          "name": {
            "value": "Nacht",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "Morgen",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "weg",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "ab",
            "synonyms": []
          }
        },
{
          "id": null,
          "name": {
            "value": "später",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "gefeiert",
            "synonyms": []
          }
        },
        {
          "id": null,
          "name": {
            "value": "Besuch",
            "synonyms": []
          }
        }
      ]
    },
    {
      "name": "mode",
      "values": [
        {
          "id": "Partymodus",
          "name": {
            "value": "Partymodus",
            "synonyms": []
          }
        },
        {
          "id": "Schlafmodus",
          "name": {
            "value": "Schlafmodus",
            "synonyms": []
          }
        },
        {
          "id": "Abwesenheit",
          "name": {
            "value": "Abwesenheit",
            "synonyms": []
          }
        },
{
          "id": "Anwesenheit",
          "name": {
            "value": "Anwesenheit",
            "synonyms": [
              "Tagbetrieb",
              "Tag"
            ]
          }
        }
      ]
    }
  ]
}

Doch Du kannst das so komplex bauen wie Du willst, Du solltest aber nur das entgegennehmen was auch relevant ist um eine Unterscheidung vorzunehmen.

Du kannst sagen
Heute wird gefeiert
oder
Heute wird gefeiert und wir machen durch bis morgen früh und singen bumsfallera

beides mal würdest Du nur gefeiert entgegen zu nehmen das reicht Dir ja als Info für den Partymodus

also
Heute wird {command}
und Command ist der Intent Slot der den Slottype enthält. Einer der Werte ist gefeiert

Die Intents nimmst Du dann im Skript entgegen und wertest diese aus mit if / elseif usw. aus. Danach startest Du dann den passenden Modus über das Skript


function Execute(Request $request)
{
	if($request->IsLaunchRequest())
	{
		$text = 'Dies war der Launch Intent vom Abwesenheits Modus bla bla';
	}
	
	$mode = strtolower($request->slots->mode);
		
	if($mode != "")
			{
				// weitere Unterscheidung und befehl absetzten
                                $text = "Es wurde ".$mode." gesetzt";
			}
	    
    // Tell the user 
    return TellResponse::CreatePlainText(
        $text
    )->SetSimpleCard(
        'Modus IP-Symcon',
        $text
    ); 
	
}

Einfach mal rumprobieren ansonsten Fragen stellen.

OK das werde ich mal probieren. Sieht interessant aus.
Aber interessieren würde mich trotzdem folgendes :
Bisher hab ich zwei Intents der eine ruft das Skript auf wie beschrieben, aber der andere ergibt dann die Meldung, dass er nicht ausgeführt werden kann. Ich erkenne also zwei unterschiedliche Intents. Wie kann ich aber dafür sorgen, dass beide Intents ein Skript aufrufen?

Gesendet von meinem SGP712 mit Tapatalk

Wenn Du nur ein Skript aufrufen willst wozu brauchst Du dann zwei Intents, da tut es doch auch einer. Bzw. ich kann Dir nicht ganz folgen wozu Du zwei Intents brauchst und dann trotzdem nur ein Skript aufrufen willst.

Sorry, wenn ich mich falsch ausgedrückt habe.
Ich hab mehrere Intents und möchte je ein Skript aufrufen und ich weiß nicht wie ich das hin bekomme.

OK wäre auch von allen Intents ein einzelnes Skript zu starten aber auch hier weiß ich nicht wie ich das mache. Ich bekomme nur jeweils einen verknüpft. Außerdem muss ich dann noch im Skript ermitteln welcher Intent es aufgerufen hat.

Gesendet von meinem SGP712 mit Tapatalk