Es geht hier zwar um die Fernsteuerung von Alexa, aber ich habe mir eine Lösung für die TextToSpeech-Ausgabe über ein Echo für meine Raspberrymatic gebaut. Mit dem Script kann man auch Dinge fernsteuern. Aber das benötige ich nicht. Ich stelle mal hier meine TTS-Lösung vor auf deren Basis auch eigene Erweiterungen/Fernsteuerungen möglich sind. Es läuft bei mir seit zwei Tagen.
Von
Lötzimmer gibt es ein Shell-Script, welches man auch auf auf einer Raspberrymatic laufen lassen kann. Das Script ermöglicht von Haus aus diverse Fernsteuerungen. Die Möglichkeiten und die Syntax kann man der Lötzimmer-Seite entnehmen. Für die Installation lädt man sich die
Version ohne jq runter. Dann öffnet man sie mit einem Editor und hinterlegt die Mailadresse und das Passwort des Amazon-Accounts in dem Script. Das ist auch der größte Pferdefuß an dieser Lösung, denn das Script muss mit den Zugangsdaten im Klartext auf die CCU. Darum darf kein ungeschützter Zugang aus dem Internet auf die CCU/RM möglich sein! Für das Script habe ich per ssh ein eigenes Verzeichnis mit dem Namen "echo" unter /usr/local/addons/ erstellt und in diese Verzeichnis das Script hinterlegt.
Ich persönlich habe dieses mit vi gemacht. Andere User bevorzugen dort SFTP oder ähnliche Dinge. Gerade wenn man aus der Windows-Welt kommt, hat ein solches Vorgehen mit dem Kopieren ganzer Dateien manchmal Nachteile, wenn diese Dateien mit einem Windows-Tool bearbeitet hat. Darum ist für mich vi das Mittel der Wahl. Nach dem Abspeichern habe ich das Script noch ausführbar gemacht (chmod +x alexa_remote_control_plain.sh) Anschließend habe ich per SSH mit
./alexa_remote_control_plain.sh -a eine Abfrage der verfügbaren Geräte gemacht. Hierbei werden gleich die notwendigen Cookies unter /tmp abgelegt und man kann gleich testen, ob der Zugriff über diesen Weg funktioniert. Für Probleme beim Zugang kann ich allerdings keinen Support geben. Bei mir hat es out of the box funktioniert.
Im Anschluss daran habe ich auf der Raspberrymatic via GUI eine Systemvariable vom Typ Text/String erstellt ("EchoText"). Diese dient zur Übergabe des anzusagenden Textes an das Scipt. Dann benötigt man noch ein Programm mit einem Homematic-Script, welches getriggert durch die Aktualisierung der "EchoText"-Variable diese ausliest und an das Script übergibt.
Ich triggere auf Aktualisierung der Systemvariable mit dem Wort "leer". Also ein Wort, welches ich allein eher nicht zur Ansage bringen werde. Das Script ist aber im DANN und im SONST hinterlegt (letzeres erledigt die Ansage). Das DANN benutzt man nur bei manuellem Starten des Programms oder zur wiederholten Ansage. Das Homematicscript ersetzt für die Übergabe erst alle Leerzeichen durch Unterstriche und danach den Punkt zwischen/nach Ziffern. Dieses ist notwendig, da sonst Temperaturansagen nicht richtig laufen. Anstatt 11.7 (Elf Punkt Sieben) oder besser wie es Android macht Elf Komma Sieben wird nämlich durch Alexa 117 (Einhundersiebzehn) Grad angesagt. Hier noch das Script des Programms:
Code: Alles auswählen
! Alexa-Sprachausgabe ########################################
var AText = dom.GetObject('EchoText').Variable();
AText = AText.Replace(' ', '_');
AText = AText.Replace('1.', '1,');
AText = AText.Replace('2.', '2,');
AText = AText.Replace('3.', '3,');
AText = AText.Replace('4.', '4,');
AText = AText.Replace('5.', '5,');
AText = AText.Replace('6.', '6,');
AText = AText.Replace('7.', '7,');
AText = AText.Replace('8.', '8,');
AText = AText.Replace('9.', '9,');
AText = AText.Replace('0.', '0,');
AText = "sh /usr/local/addons/echo/alexa_remote_control_plain.sh -d Wohnzimmer -e speak:'" # AText # "'";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(AText);
Das Script ist sicher nicht schön, funktioniert aber. Ein generelles Ersetzen der Punkte durch Kommata empfiehlt sich eher nicht, da es zu merkwürdigen Betonungen bei der Sprachausgabe führt.
Wie kann man nun anders als diese Sprachausgabe eigene Steuerungen per Homematic auslösen? Eigentlich braucht man nur die Zeile
AText = "sh /usr/local/addons/echo/alexa_remote_control_plain.sh -d Wohnzimmer -e speak:'" # AText # "'"; an die eigenen Steuerungsbedürfnisse anpassen. Zum Beispiel für das Wetter
AText = "sh /usr/local/addons/echo/alexa_remote_control_plain.sh -e weather"; Dann diesen String zusammen mit der letzten obigen Scriptzeile in ein neues Programm und Script und getriggert durch irgendeine Homematic-Aktion wird die Steuerung ausgelöst.
Keine Ahnung, ob das auch so auf einer CCU lauffähig ist. Ich war überrascht, dass das so problemlos auf meiner Raspberrymatic funktionierte.
EDIT:
Ergänzung:
Bei einem Reboot gehen ja die unter /tmp abgelegten Cookies verloren. Ein Neuanlegen ist je nach Gusto vom Amazon etwas tricky (Stichwort: Captcha). Damit diese Funktion nicht mehr als notwendig zum Pflegefall wird, habe mir hierfür ein Programm angelegt, welches täglich die vorhandenen Cookies aus dem /tmp-Verzeichnis auf ein Verzeichnis eines angesteckten USB-Sticks kopiert, bzw. beim Reboot der Raspberrymatic diese von dort wieder in das /tmp-Verzeichnis schreibt. Hierbei wird auch auf das Vorhandensein Rücksicht genommen (cp -u) und nicht ggf. vorhandene neuere Dateien überschrieben.
Der Inhalt des ersten "Scripts" zum täglichen Sichern der Dateien (alle Dateien mit Namen .alexa) lautet
Code: Alles auswählen
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("cp -u /tmp/.alexa* /media/usb0/backup/echo/");
Für das Zurückschreiben nach einem Reboot (ich nutze hierfür die umbenannte originale Anwesenheitsvariable mit ihrem speziellen Boot-Verhalten) lautet die Zeile:
Code: Alles auswählen
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("cp -u /media/usb0/backup/echo/.alexa* /tmp/");
Wie man sehen kann, ist für diese Befehlszeile ein installiertes Addon CUxD und ein angelegtes SystemExec-Geräte (2801001) notwendig. So kann ich auch mal ggf. die Rasperrymatic durchbooten oder ein Addon updaten, ohne dass es gleich notwendig ist, die Cookies neu anzulegen. Man muss sich ja nicht mehr Arbeit machen, als unbedingt notwendig ist. hth
Gruß Xel66