Hallo Forum,
nach viel Gewürge hab ich nun meinen Amazon Echo an IP Symcon angebunden, sowie einen Proxy erstellt, damit man auf ein SSL Zertifikat verzichten kann.
Ich dachte, ich schreib mal aus dem Gedächtnis zusammen, wie das geht, und hänge die Sourcen an. Warnung - das ist sicher quick und dirty, und Programmierer bin ich auch nicht, d.h. das ganze ist aus Stücken, welche ich im Internet fand, zusammengebaut und auf Symcon modifiziert.
Das ganze basiert auf einem Custom Skill, die Variante Home Automation Skill überlasse ich Paresy. Wenn Ihr Euch erstmal das Prinzip ansehen wollt, schaut in das credits file (mein Dank für die Vorarbeiter!) und dort in die Vorgehensweisen.
Anleitung:
0. Amazon Echo / Dot / Tap organisieren
(hab ich beim letzten US trip mitgebracht).
Ihr braucht einen US account. Einfach mit (existierender) Dummy Addresse in USA anlegen. Wenn alles geht, wieder auf Euren deutschen Account umstellen. Klappt (mit einigen Einschränkungen, z.B. Prime geht bei mir nicht).
Untenstehendes ZIP file irgendwo auf Eurem PC auspacken - auf die files wird dann im Text verwiesen.
amazon echo symcon.zip (7.99 KB)
Edit: Halleluja, kommt auch in DE raus. Damit braucht man natürlich keinen US Account mehr und Prime Musik sollte dann auch funktionieren. Die Anleitung funktioniert dennoch weiterhin.
1. Account auf developer.amazon.com
[ul]
[li]Custom Skill anlegen[/li][li]Passenden Invocation name aussuchen, z.B. greenhouse. Euer Echo reagiert dann auf „Alexa, ask greenhouse …“[/li][li]Inhalt von intent.txt ins Intent Schema [/li][li]Inhalt von utterance.txt in das Feld Sample Utterances[/li][/ul]
Spätestens hier fällt auf, Amazon Echo wird nur als Spracherkennung genutzt, die ganze Logik passiert später unter Symcon in php.
Edit: Nun geht das auch auf deutsch. Intent und utterance ganz genau wie oben, unverändert, nur die invocation phrase natürlich dann in deutsch anlegen und in den deutschen Tab, der nun vorhanden ist, eintragen.
[ul]
[li]Unter Step Configuration könntet ihr nun:[/li][/ul]
Direct den https link zu Eurem Symcon Server eintragen, sofern a) der Server mit SSL läuft und bei einer Zertifizierungsorganisation zertifiziert ist. Mann muss also keineswegs auf AWS Lambda zurückgreifen, wie die Amazon Anleitungen suggerieren, das ist nur eine Option.
Wenn ihr nun kein SSL Zertifikat habt:
Davon, symcon mit SSL zu zertifizieren hab ich erstmal Abstand genommen, da dies doch recht aufwändig ist. Anstelle dessen habe ich einen Proxy bei Azure angelegt, d.h. ihr müsst dann hier unter Configuration (später) den Proxy link eingeben, der Anfragen auf Euren internen Symcon Server umlenkt. Dazu muss der natürlich über DynDNS im Web erreichbar sein.
Edit: Paresy’s Vorschlag von unten aufgreifend - man kann auch den Symcon Connect Link nehmen. Dazu muß der Connect Dienst in Symcon aktiviert sein. Dann den zugehörigen Link nehmen und um …/hook/<name eures webhooks> ergänzen und wie oben beschrieben unter Configuration eintragen.
Edit: Solltet Ihr zwei Sprachen unterstützen (Englisch/Deutsch) noch unter „Configuration“ beide Endpunkte (North America/Europe) anklicken und mit links auf entweder den Proxy oder Euren Symcon Connect Link versehen. Sonst gibt es beim Testen in der Sprache des jeweils nicht angewählten Endpunkts eine kryptische Fehlermeldung).
[ul]
[li]Unter SSL Certificate:[/li][/ul]
anklicken von:
My development endpoint is a subdomain of a domain that has a wildcard certificate from a certificate authority
Das passt deswegen, da ja der Azure Web service SSL zertifiziert ist. Damit ist Amazon Echo dann glücklich, und der redirect spart Euch den SSL Zertifizierungsumstand.
Edit: Genauso geht es mit dem Symcon Connect link.
[ul]
[li]dann erstmal save. Am besten das Fenster weiter offenhalten, das braucht ihr nochmal weiter unten.[/li][/ul]
Edit: Ich glaube (bin mir nicht sicher), man braucht nun für die deutsche Variante noch einen Eintrag un
[ul]
[li]Unter Step Publishing[/ul][/li]unter Countries & Regions. Ich hab dort alle ausgewählt und in die übrigen Felder was halbwegs sinnvolles eingetragen. Eine Zertifizierung hab ich nicht ausgewählt, da nicht sinnvoll (der Skill ist ja nur für Euch). Diese war zumindest zum Zeitpunkt der Erstellung auch gar nicht anwählbar (15.09.2016).
2. Optionalen Proxy anlegen (kann man sich mit der Symcon Connect Variante sparen)
- Kann man in AWS Lambda oder Azure machen. Ich habs in Azure gemacht (siehe 2.-ter link im credits file). Dazu:[/li][li]In Azure Account anlegen[/li][li]Kostenlosen Testaccount verwenden (läuft erstmal einen Monat). Danach sinds vermutlich auch nur kleine Pfennigbeträge, weiss ich selbst noch nicht was das kostet. [/li][li]Unter App Services auf hinzufügen klicken - Namen vergeben, irgendeine Ressourcengruppe vergeben, an Dashboard anheften, erstellen. Dauert ne Minute, dann habt ihr Euren proxy server. [/li][li]Dem muss man dann noch beibringen, bei Aufruf auf Euer Symcon umzulenken.[/li][li]Dazu auf Step Übersicht gehen, oben stehen alle links, die man so braucht.
[li]Von dort Link URL kopieren, tragen wir nun (als https !) in den Tab Configuration bei developer.amazon.com ein. [/li]Achtung - hängt dort noch ein /hook/<irgend ein name für einen webhook> dran, z.B. https://hausproxy.azurewebsites.net/hook/hausecho. Das auswertende php file realisieren wir nämlich später in sycmon als webhook.
[li]Unter Tab Anmeldeinformationen für Bereitstellung legt ihr nun noch ein FTP passwort an.[/li][li]Nun braucht ihr einen FTP client (Filezilla) auf eurem PC. Nutzt ftp hostname, bereitstellungs ftp benutzername und das neu angelegte passwort, um von Filezille auf Azure zuzugreifen.[/li][li]Navigiert in folder ‚site‘ und ladet dort file applicationHost.xdt hoch (im Verzeichnis Azure_proxy)[/li][li]Nun müsst ihr noch file web.config an Eure Situation anpassen - dazu sucht nach your.dyndns.domain:your_port und setzt dort Euren DynDNS Name für Euren Symcon Server ein. [/li][li]Anschliessend auf Azure ins Verzeichniss wwwroot gehen und dort web.config hochladen.[/li][li]Nun habt ihr Euren Proxy. Wenn ihr absolut keine Ahnung habt, was das war - googled ARR für IIS. [/li]Ach ja, da ist noch jede Menge Zeug in dem web.config, was man gar nicht braucht. War aber zu faul, das zu löschen - stört nicht weiter.
Kurz zum Verständnis: Wenn Ihr Eure Alexa anlabert, schickt die das zu dem Amazon Echo Service. Der dekodiert die Sprache in Text und schickt das an den Proxy. Der ist schön mit zertifiziertem SSL versehen (ist ja Microsoft Azure), eine Voraussetzung für den Amazon Service. Der macht jetzt ein Redirect auf Euren Symcon Server und ruft dort einen Webhook auf, den wir gleich anlegen.
3. Symcon einrichten
[ul]
[li]Legt Euch eine Kategorie an, z.B. AmazonEcho[/li][li]Kopiert files index, functions und lights.php dort als Scripte rein. Nennt die in Symcon auch so (umbenennen der automatisch vergebenen Skriptnamen). Oder alternativ ändert die ‚includes‘ im PHP index für diese files.[/li][li]Legt einen Webhook an auf index.php mit dem Namen, welchen Ihr oben in dem Amazon Echo Configuration Tab als Anhang an die Proxy Domain vergeben habt. [/li][li]Ach ja, mein symcon web server läuft mit SSL, ist aber nicht zertifiziert. Also die Variante, die im Browser erstmal hässliche Warnungen fabriziert, die man absegnen muß. Ich erwähn das mal, da ich die Translation in obigen ARR files nicht wirklich verstehe, und das eben genau so bei mir funktioniert. Müsste aber auch ohne SSL gehen. [/li][li]Das File index php ruft module auf (momentan nur eins bei mir, lights.php). Passt dort in ligths.php die Aufrufe Eurer Devices an, und auch die Auswertung der Texte.[/li][li]Edit:Für ein Quentchen mehr Sicherheit könnt ihr ggfs. die auskommentierten Checks in der index.php wieder aktivieren. Dazu application und userid per IPS_LogMessage testweise rausschreiben in die IPS Meldungen und dann ganz oben in index.php einfügen.Die Zertifiierungsabfragen gehen aber nicht, wenn ihr den Connect Service nutzt, da diese vom Connect Service nicht mitgegeben werden. Also diese nicht auskommentieren. [/li][li]Edit: Solltet ihr bi-lingual arbeiten wollen, dann könntet ihr auch die locale auswerten. Ggfs. müsste dann noch der Response entsprechend aufgebohrt werden. [/li][/ul]
Was mir bei dem Ansatz gefiel, war die Möglichkeit, die Auswertung in php zu machen. Im Grund wird nur nach Schlüsselworten gesucht. Ihr könnt soviel drumrumquatschen, wie ihr wollt.
Z.B. führen bei mir „Alexa, ask <euer invocation name> switch north“ genauso zum Umschalten der nördlichen Wohnzimmerlampe, als wenn ich sagte: „Alexa, ask <euer invocation name> switch lamps in living room north.“
Man muß lediglich darauf achten, dass die Schlüsselworte nicht zweideutig werden.
Edit: Die scripts sind genauso auch für die deutsche Variante verwendbar. Einfach den Text in deutsch ändern und die Schlüsselworte auf deutsch hinterlegen und ein wenig anpassen. Ich hab mir dazu einfach die englischen Scripte kopiert, umbenannt (lights.php --> licht.php), ein „require“ darauf ergänzen, und dann geht das sogar bi-lingual.
Noch ein Wort zu dem index.php - man erkennt, dass der clevere Programmierer (nicht ich) dort auch schon Sicherheitscode lt. Anweisung der Amazon Developer Documentation hinterlegt hat. Das braucht man, wenn man sich den code von Amazon für ein Publishing zertifizieren lassen will. Den hab ich für meine Zwecke erstmal rauskommentiert.
So, war doch ganz einfach, oder? Vermutlich hab ich Details vergessen niederzuschreiben - fragt ggfs., dann antworte ich so gut ich es weiss und ändere das hier.
PS: Als Tip: Erstmal einen testhook erstellen, der vielleicht nur ein echo „hallo world“ enthält, und schauen, ob die proxy redirection als url in einem Browser funktioniert. Ansonsten ist das debugging schwierig.
So, traut Euch - das Teil ist geil.
Viele Grüsse
Axel