Amazon Echo an Symcon anbinden inklusive Proxy

Hatte ich vor einiger Zeit mal geaendert in

 $AlexaMasterKeyArray

Man … das wars :smiley:

Hab aber heute erst die Files von Github geladen --> update :rolleyes:

Danke für die Arbeit und Unterstützung!!

Hallo zusammen,
ich habe die Scripte aus dem GIT verwendet und eingebunden


Die Includierung habe ich mit den script-ID gemacht.

IPSUtils_Include ("35995 /*[Program\IPSLibrary\data\privat\AmazonEcho\AmazonEchoConfig]*/.ips.php");
	IPSUtils_Include ("40097 /*[Program\IPSLibrary\data\privat\AmazonEcho\AmazonEchoInclude]*/.ips.php");

Der Webhook zeigt auf das Script AmazoEcho

Der Skill hat Internt:

{ "intents": [ 
{ "intent": "DoCommand", 
"slots": [ { 
"name": "command", 
"type": "symcon" } ] } ] }

die Variable symcon:

schalte
schalte ein
schalte aus
status
dimme
decke
lampe
hoch

Utterances:

DoCommand {command}

und findet auch meinen Server über Connect.

Der Test aus dem Amazon developer mit dem keyword „schalte“ feuert einige Fehlermeldungen in der Konsole.

Die Response ist das: „The remote endpoint could not be called, or the response it returned was invalid“

Was mache ich falsch?

Danke und Gruß
Tom

Hallo
Benutze mal das Testscript aus dem GIT. Das geht schneller und man muss nicht immer reden mit Alexa.

Da hänge ich aber auch grade:

The remote endpoint could not be called, or the response it returned was invalid.

Testscript funtkionert. Alexa meint: Bei der Kommunikation mit dem angegebenen Skill ist ein Problem aufgetreten.

Schalte ich den Hook um auf das Script von Post#1 ist alles OK. :confused: Also sollte die Grundkonfig passen, bezüglich HTTPS etc.

Hi 1007,
das Testscript wirft folgendes:


dimme licht im arbeitszimmer
Warning:  Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\40097.ips.php on line 17

Session:0
Response : Ich habe : dimme licht im arbeitszimmer nicht verstanden

Die Stelle ist in der AmazonEchoInclude = 40097.ips.php

foreach($AlexaMasterKeyArray as $c)

meine Config:

<?
	GLOBAL $applicationIdValidation;
	GLOBAL $userIdValidation;           
	GLOBAL $echoServiceDomain;         
	GLOBAL $debug;
	GLOBAL $logging;
	GLOBAL $parentDataID;
	GLOBAL $AlexaArray;
	GLOBAL $AlexaMasterKeyArray;  
	GLOBAL $AlexaLightArray;  
//******************************************************************************
//	AmazonEcho relevante Definitionen
//******************************************************************************
	
	$applicationIdValidation    = 'amzn1.ask.skill.MEINSKILL';
	$userIdValidation           = 'amzn1.ask.account.MEINEID';
	$echoServiceDomain          = 'echo-api.amazon.com';
//******************************************************************************
//	IPSymcon relevante Definitionen
//******************************************************************************
	$debug   = true;
	$logging = true;
	$parentDataID = IPSUtil_ObjectIDByPath("Program.IPSLibrary.data.privat.AmazonEcho");
//******************************************************************************
// Demo Konfiguration
// Suche nach Schluesselwoerter um dann das angegeben Script zu starten
//******************************************************************************
	$AlexaArray = array( 
				
	array("search('licht') AND ( search('schalte') OR search('dimme') ) " ,"AmazonEcho_Licht.ips.php"		),
	array("search('temperatur') AND search('hoch') ","AmazonEcho_Temperatur.ips.php"),
				);
				
	$AlexaLightArray = array(  
    //       spoken         spoken           response         IPSLight Name       not used ............. 
    array("wohnzimmer"    ,""                ,"Wohnzimmer"    ,"Wohnen Deckenlicht"    ,true    ,true    ,false), 
    array("esszimmer"    ,"decke"        ,"Esszimmer"    ,"Essen Deckenlicht"    ,true    ,true    ,false), 
    array("esszimmer"    ,"lampe"        ,"Esszimmer"    ,"Essen Steinlampe"        ,true    ,false    ,false), 
                    ); 			
				
				
				
?>

Gruß
Tom

Les mal paar Posts über Dir :smiley: Bin in die gleiche Falle getappt.

$AlexaArray
in
$AlexaMasterKeyArray

ändern.

Hallo
Aendere Mal

 $AlexaArray = array(  

in

$AlexaMasterKeyArray = array(

Hallo Leute,

bei der Ausführung des Testskriptes erhalte ich folgende Fehlermeldung.

Warning: in_array() expects parameter 2 to be array, null given in /var/lib/symcon/scripts/AmazonEchoInclude.ips.php on line 54

Hat jemand eine Idee?

Gruß

Axel

Fehler gefunden!

Ich war mir nicht sicher ob die Skripte entsprechend benannt direkt unter der Kategorie „AmazonEcho“ liegen sollen, was ja zur Folge hat das sie im Skript-Verzeichnis nach den entsprechenden ID Nummern benannt werden.
Offensichtlich ist es richtig die Skripte (natürlich richtig benannt) direkt im Skriptverzeichnis abzulegen.

Das Testskript funktioniert jetzt.

Wenn ich aber den gleichen Befehl über das Amazon Webfront absetze, bekomme ich dort folgende Meldung: „The remote endpoint could not be called, or the response it returned was invalid.“

In IP Symcon kommt folgende Fehlermeldung: „Ich habe : dimme licht wohnzimer nicht verstanden“

Wenn ich das ganze per Sprachbefehl ausführe bekomme ich folgendes Sprachfeedback: „Bei der Kommunikation mit dem angeforderten Skill ist ein Problem aufgetreten“

Gruß

Axel

Hi, ich finde den Bug leider auch nicht. In den IPS Meldungen kommt:

18.12.2016 20:09:03*| PHP*| Error: Warning: include(): Filename cannot be empty
   Error in Script C:\IP-Symcon\scripts\amazonecho.ips.php on Line 73
  134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
   37 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
   73 in scripts\amazonecho.ips.php (call IPSLogger_PhpErrorHandler)
   73 in scripts\amazonecho.ips.php (call include)
18.12.2016 20:37:51*| PHP*| Error: Warning: include(): Failed opening '' for inclusion (include_path='.;C:\php\pear')
   Error in Script C:\IP-Symcon\scripts\amazonecho.ips.php on Line 73
  134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
   37 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
   73 in scripts\amazonecho.ips.php (call IPSLogger_PhpErrorHandler)
   73 in scripts\amazonecho.ips.php (call include)
18.12.2016 20:37:51*| PHP*| Error: Warning: Cannot modify header information - headers already sent by (output started at C:\IP-Symcon\scripts\amazonecho.ips.php:1)
   Error in Script C:\IP-Symcon\scripts\AmazonEchoInclude.ips.php on Line 242
  134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
   37 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
      in IPSLogger_PhpErrorHandler
  242 in scripts\AmazonEchoInclude.ips.php (call header)
  181 in scripts\AmazonEchoInclude.ips.php (call respond)
   78 in scripts\amazonecho.ips.php (call ContinueSession)
18.12.2016 20:37:51*| PHP*| Error: Warning: Cannot modify header information - headers already sent by (output started at C:\IP-Symcon\scripts\amazonecho.ips.php:1)
   Error in Script C:\IP-Symcon\scripts\AmazonEchoInclude.ips.php on Line 254
  134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
   37 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
      in IPSLogger_PhpErrorHandler
  254 in scripts\AmazonEchoInclude.ips.php (call header)
  181 in scripts\AmazonEchoInclude.ips.php (call respond)
   78 in scripts\amazonecho.ips.php (call ContinueSession)

Zeile 73 ist diese hier:

$endsession = include($ScriptName);

Neue Version auf GitHub

ich habe seit gestern auch ein echo :slight_smile:

vor einiger zeit habe ich her noch gelesen das es bisher nur per custom skill moeglich war sein ip symcon anzusteuern, ich habe mir einen IP symcon smart home skill am laufen. war eigentlich mega easy. die beiden notwendigen oauth URLs habe ich einfach als webhook in ips laufen. ist alles ganz primitiv, und muss man noch etwas ausbauen, aber als proof of concept funktioniert es.

die lambda funktion discovered auch devices, diese muss man allerdings manuell in den code aufnehmen, hier koennte man auch was netteres machen, z.b. die devices aus IPS abfragen.

in dem control part der lambda funktion rufe ich dann einfach entsprechende hooks auf um zum beispiel mein licht ein/aus zu schalten.

falls ihr interesse habt kann ich das mal detailierter aufschreiben.

Falls Dir bezüglich Device Discovery in IPS was einfällt kannst Du das gerne teilen. Eine Möglichkeit ist es sicher das jeder der will und kann sich einen eigenen Smart Home Skill über OAuth anbindet, dann hat er auch für sich selber das Kontinent von 1 Mio Aufrufe bei Lambda frei.

Für ein PHP Modul für Alle gibt es noch Dinge zu klären, aber im Hintergrund ist man dran also einfach noch Geduld haben bis alles geklärt ist, derweil könnt ihr ja fleißig weiter basteln und Ideen einbringen.

Bezüglich der Geräteerkennung würde ich mir folgendes wünschen um möglichst wenig im Quelltext anpassen zu müssen. Eine Kategorie Lampen, Temperatur, Rollläden etc… In diesen Kategorien verknüpft man einfach die gewünschten Geräte bzw. Variablen (On, Off, Dimmen etc.). Wenn Alexa eine Geräteabfrage startet müssen ja nur die Infos der verlinkten Geräte ausgelesen werden.

Gruß Stephan

Ich denke das ich den skill auch so hinbekomme das er fuer alle funktioniert. Bei einem SmartHome Skill muss viel weniger gebastelt werden. Das ganze string geparse faellt z.B. web. Ich kann in der Alexa App Gerate konfigurieren, Gruppen bilden usw.

Die discovery wuerde ich per script machen, ich habe bereits ein script was alle lichter im Haus abschaltet. Hier fehlt (ist mein derzeitiger Kentnisstand) IPS aber eine ebene der abstraction um es auch fuer alle Marken generisch zu implementieren, soll heissen, einen Homatic Schalter wird anders angesprochen als ein FooBar Schalter, haetten wir in IPS generische Schalter dann waer das einfacher… da kommt mir gerade eine Idee, das koennte man auch einfach loesen :wink:

Finde ich ne gute Idee. User muessten die Aktoren, oder Links zu Aktoren, in einen Ordner legen wo sie vom Script gefunden werden. So kann man dann auch nur die Gerate finden lassen die man auch per sprache steuern moechte und es greift nicht in die bisherige ordnungs strategie ein die man sich ausgedacht hat, da kocht ja jeder sein eigenes süppchen :wink:

oder man macht es wie bei der HomeKit-Integration wo ein „virtuelles“ Gerät angelegt wird in dem mann die zu schaltenden Variablen hinterlegt. Also z. B. Lampe 1 mit den Feldern Variable AN, AUS und DIMMEN. Das sollte dann ja sehr flexible sein und bei so ziemlich allen Geräten funktionieren. Falls nur die Variable nicht reicht könnte man ja auch die Möglichkeit integrieren den kompletten Befehl frei eintragen zu können.

Gruß Stephan

ich hatte eben daran gedacht das man zum schalten ein/aus immer ein kleines script anspricht was per GET die geraete ID, An/Aus, Hersteller und Typ bekommt, so kann dann jeder den einzeiler implementieren der fuer sein geraet notwendig ist.

In meinem jetzigen Zustand habe ich bereits bei den Geraeten (in der Alexa device discovery) noch hinterlegt was es fuer ein typ ist, also schalter, dimmer oder rollo, den typ sende ich dann mit an mein script wo dann per if/else der entsprechende befehl ausgesucht wird der fuer diese geraeteklasse verwendet werden muss.

der vorteil von deinem ersten vorschlag (einen ordner mit links) ist vielleicht besser fuer leute ohne programmierkenntnisse da man nicht in einem script rumhacken muss. Man koennte auch ueber ALLE instancen iterieren und nach bestimmten variablen suchen. z.B. ich gebe meiner Homatic oder FooBar Lichtschalter Instanz die variablen: alexa=true, type=dimmer/switch/shutter/thermostat, vendor=homematic/FooBar/etcpp

dann gibt es 4 scripte (2 zeiler) die von jedem user implementiert werden muessen um die Geraete zu steuern, bei einem Hoematic schalter waer das in etwa: HM_WriteValueBoolean($_GET[‚ID‘], „STATE“, $_GET[‚STATE‘]);

Man könnte den gesamten Objektbaum nach den Instanzen deren GUIDs durchsuchen anhand der GUID weis man dann auch um was für eine Instanz es sich handelt müsste dann aber noch anhand der Ident nachschauen um welchen Typ von Gerät es sich genau handelt da ein Homematic Device z.B. ein Schalter oder auch ein Rollladen sein kann. Dann weis man auch welches Gerät welche Befehle erhalten kann. Problematisch wird das nur wenn es sich z.B. um eine Dummy Instanz handelt oder Lösungen bei der der User alles mit Skripten steuert denn dann weis man nicht was da alles darunter liegt und das würde auch voraussetzen das der User eine Ident zugeordnet hat mit der dann eine automatische Erkennung etwas anfangen kann. In sofern müsste man wohl doch eine zusätzliche Echo Instanz erschaffen in der dann konfiguriert wird welche Skripte z.B. gestartet werden sollen oder welche selbst vom User angelegte Variable geschaltet werden soll wenn ein Befehl von Echo kommt.

weiss jemand ob ich in einem script einen Thread starten kann? Wenn ich Alexa bitte meine rollos zu fahren, dann timed die Lambda funktion nach 3 sekunden aus und behauptet das geraet unterstuetze diese funktion nicht, im lambda log sieht man dann das timeout, die rollos fahren aber die position an.

sehe folgende loesungen:

  1. lasse das Shutter script in einem Thread asynchron laufen (nutzt PHP)
  2. rufe den webhook aus der lamda funktion heraus bereits non-blocking auf (nutzt python 2.x)