Dynamische Sprachausgabe mit Airplay wiedergeben

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Blurline
Beiträge: 63
Registriert: 06.08.2013, 09:22

Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von Blurline » 20.08.2013, 17:55

Haben in vielen Räumen airport Express mit Boxen dahinter.

Nun setzt ich Texte in Systemvariabeln.

Beispiel: "Es sind x Grad, Maximale Temperatur x Grad, Regenwahrscheinlichkeit X Prozent"

X sind natürlich Werte aus der homematic.

Diese übergebe ich an translate.google und hole mir ein mp3.

Dieses wird auf der Homematic abgespeichert.

Anschließend wir per remote PC eine CMD aufgerufen. Die kopiert mir das aktuelle File auf meinen PC.

Ich konfiguriere per Airfoil die entsprechenden Boxen und die Wiedergabe startet.

So bekomme ich auf der Terasse beim öffnen der Tür die aktuellen Daten gesagt.

Bei Wunsch stelle ich alles zur Verfügung.

http://youtu.be/2Cl-kYAD6tU


Tutorial: ACHTUNG BIN GERADE DRAN!
Was mir gerade noch nicht gefällt ist, dass ich beim Homematic Programm in dem die CCU-RemotePC.exe angesprochen wird, nicht gleich Parameter mitgeben kann.

Ein CCU-RemotePC.exe Befehl cmd("translategoogle.cmd WetterSprachausgabe Terasse Wohnzimmer") funktioniert nicht.

Vielleicht hat da jemand einen Tipp.

Deswegen:

Code: Alles auswählen

string stdout;
string stderr;
string url="http://192.168.X.X:8881/WetterSprachausgabe";
system.Exec("wget -q -O /dev/null " # url, &stdout, &stderr);
Je Systemvariabel habe ich einen Eintrag in der CCU-RemotePC, sowie eine eigene NamederSystemvariabel.CMD die nichts anderes macht als die translategoogle.cmd mit Parametern aufruft.
CCU-RemotePC.jpg
TODO:
In NamederSystemvariabel.CMD Parameter an translategoogle.cmd mitgeben um die gewünschten airports einzuschalten.

WICHTIG!
Ich habe das ganze in wenigen Stunden zusammen geschustert. Mir war erstmal wichtig, ob es funktioniert.
Ich werde mich demnächst daran begeben alles etwas besser aufzuarbeiten. Falls jemand bessere Wege/Optimierungen hat -> ich lerne gerne immer wieder dazu.

Folgende Systemvariabeln müssen angelegt werden:
Zeichenkette WetterSprachausgabe

Benötigte Addons:
CCU1:
http://www.homematic-inside.de/software ... net-dienst -> mit Telnet ein Passwort für den FTP Zugang auf der CCU einrichten

Telnet Session (Windows) öffnen:
Start
Eingabeaufforderung
> telnet
> open 192.168.X.X
> root
> passwd
> dein Passwort
> dein Passwort

http://www.homematic-inside.de/software/addons/item/ftp -> Installieren

Filezilla:
https://filezilla-project.org/ -> Ordner/Datei Struktur unter /usr/local/addons/translategoogle/ anlegen -> Berechtigung der translategoogle.tcl auf 755 setzen
Server:192.168.X.XXX
User:root
Passwort:dein Passwort was beim Telnet gesetzt wurde

CCU2:
Filezilla:
https://filezilla-project.org/ -> Ordner/Datei Struktur unter /usr/local/addons/translategoogle/ anlegen -> Berechtigung der translategoogle.tcl auf 755 setzen
Server: sftp://192.168.X.XX
User:root
Passwort: MuZhlo9n%8!G
Port: 22

http://www.homematic-inside.de/software/cuxdaemon -> Performance schonender Aufruf
CUxD Gerätetyp: System (28) erstellt

http://www.homematic-inside.de/software ... u-remotepc -> Auf dem PC einen Ordner C:\\translategoogle erstellen und in den Ordner die Dateien in diesen packen

http://www.rogueamoeba.com/airfoil/windows/ -> Airfoil um die jeweiligen airports anzusprechen

Script im Programm: (Name der Systemvariabel als Parameter!)

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("tclsh /usr/local/addons/translategoogle/translategoogle.tcl WetterSprachausgabe");
translategoogle.tcl zum holen des .mp3 (/usr/local/etc/config/addons/www/Soundfiles werden hier abgelegt, Ordner anlegen)

Code: Alles auswählen

load tclrega.so

# Variablen: Zeichenkette wird als Parameter übergeben
set command ""
append command "dom.GetObject(" \" [lindex $argv 0] \" ").Value();"
set ausgabe [rega $command]

# Aufruf und Erstellung der Datei
# =============================== 
set url http://translate.google.com/translate_tts?tl=de&q=$ausgabe
exec /usr/bin/wget -q -U Mozilla -O /usr/local/etc/config/addons/www/Soundfiles/$argv.mp3 $url

Wenn das Programm startet, wird der Text aus der Systemvariabel an translate.google übergeben und man bekommt ein .mp3 zurück

Ich habe auf meinem PC einen Ordner c:\translategoogle\ mit folgenden Dateien.

C:\translategoogle\bin (ein Ordner in dem die anderen Scripte sind)

C:\translategoogle\bin\wget.exe
http://users.ugent.be/~bpuype/wget/

C:\translategoogle\bin\translategoogle.cmd

Code: Alles auswählen

REM Vorhanden mp3 löschen
DEL %1.mp3

REM Aktivierung der jeweiligen airports ggf. mehr Parameter anfügen und mehr .js erstellen
REM TODO Durch Parameterübergabe loopen und parameter an js übergeben.
bin\%2.js

REM Neue mp3 holen
bin\wget.exe "http://XXX.dyndns.org/addons/Soundfiles/"%1".mp3"

REM mp3 starten
call "%1.mp3"

REM Pause
ping /n 15 localhost >nul

REM Abspielprogramm schliesen
taskkill /F /IM wmplayer.exe

REM Alle airplay Lautsprecher wieder freigeben
bin\disconnect.js

REM ggf airfoil beenden
REM taskkill /F /IM airfoil.exe
c:\translategoogle\bin\airport1.js -> Hier drin muss der Name des Airports angepasst werden

Code: Alles auswählen

var airplayLautsprecher = "Günzel";
var airfoilApp = WScript.CreateObject("RogueAmoeba.Airfoil");
var speakerCollection = airfoilApp.GetSpeakers();

for (var i = 0; i < speakerCollection.Count(); i++)
{
	var speaker = speakerCollection.Item(i);
	// WScript.Echo("Speaker " + i + " is " + speaker.Name() + "\n");

	// Set the volume to half and connect if it isn't already connected
	speaker.SetVolume(0.5);
	if(speaker.Name() == XXXNamedesAirplayLautsprecherXXX)
	{
		speaker.Connect();
		//WScript.Echo(speaker.Name() + " wurde verbunden\n");
	}
}

function endsWith(str, suffix)
{
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
c:\translategoogle\bin\disconnect.js -> zum wieder freigeben der Boxen

Code: Alles auswählen

var airfoilApp = WScript.CreateObject("RogueAmoeba.Airfoil");
var speakerCollection = airfoilApp.GetSpeakers();
var runningSources = airfoilApp.GetRunningSources();

for (var i = 0; i < speakerCollection.Count(); i++)
{
	var speaker = speakerCollection.Item(i);
	// WScript.Echo("Speaker " + i + " is " + speaker.Name() + "\n");

	// Set the volume to half and connect if it isn't already connected
	if(speaker.Connected())
	{
		speaker.Disconnect()
		// WScript.Echo(speaker.Name() + " wurde abgemeldet\n");
	}
}
C:\translategoogle\WetterSprachausgabe.cmd
(CCU-Remote kann derzeit leider nicht eine CMD mit Parameter öffnen, sonst würde der Aufruf cmd("WetterSprachausgabe.cmd") direkt auf translategoogle.cmd mit Parameter sein. )

Code: Alles auswählen

call bin\translategoogle.cmd %~n0 airport1 
C:\translategoogle\CCU-RemotePC.exe
Programm um einen Befehl auszuführen

C:\translategoogle\config.xml
-> Config der CCU-RemotePC.exe. Könnte man auch per CCU irgendwann dynamisch erstellen lassen

Jetzt muss CCU-RemotePC konfiguriert werden.
CCU-RemotePC.jpg

Code: Alles auswählen

Beschreibung: Starten der Audioausgabe
Befehl: WetterSprachausgabe
Code: cmd("WetterSprachausgabe.cmd")
Jetzt fehlt nur noch das Programm wie z.B. "Wenn Fenster geöffnet dann"

Code: Alles auswählen

string stdout;
string stderr;
string url="http://192.168.X.X:8881/WetterSprachausgabe";
system.Exec("wget -q -O /dev/null " # url, &stdout, &stderr);
Noch als Anhang ;)
Script im Programm: (Bsp. zum Befüllen der WetterSprachausgabe)

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("tclsh /usr/local/addons/translategoogle/sprachvariabeln.tcl");
sprachvariabeln.tcl zum setzen der WetterSprachausgabe
(Die Werte kommen aus meinem Bewässerungsscript / wunderground)

Code: Alles auswählen

load tclrega.so

# Variablen: WetterSprachausgabe Zeichenkette

array set values [rega_script {
var wetterstation=dom.GetObject(2941).Value().ToInteger();
var maxtemp=dom.GetObject('Wetterprognose-Heute').Value().ToInteger();
var prozentregen=dom.GetObject('Wetter-Regen-Heute').Value().ToInteger();
}]

set wetterstationtemp $values(wetterstation);
set maxtemp $values(maxtemp);
set prozentregen $values(prozentregen);

# Werte in Variabel schreiben
# =============================
set rega_cmd ""
append rega_cmd "var w0 = dom.GetObject('WetterSprachausgabe');" 
append rega_cmd "w0.State('Aktuell $wetterstationtemp Grad, Maximale Temperatur $maxtemp Grad, Regenrisiko $prozentregen Prozent');"
rega_script $rega_cmd
Für "nicht dynmaische" Teste nutze ich folgenden Programmcode
Habe eine weitere Systemvariabel angelegt. Im Programmaufruf schreibe ich einfach den Text der sich nicht auf die anderen Homematic Werte bezieht.

Code: Alles auswählen

dom.GetObject('SprachausgabeFlur').State('Eine Bewegung im Ankleidezimmer wurder erkannt');
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("tclsh /usr/local/addons/translategoogle/translategoogle.tcl SprachausgabeFlur");
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null 'http://XXX:8881/SprachausgabeFlur'");
Zuletzt geändert von Blurline am 22.08.2013, 12:30, insgesamt 13-mal geändert.

t_heinrich
Beiträge: 542
Registriert: 24.07.2011, 16:38

Re: Dynamische Texte mit Airplay wiedergeben

Beitrag von t_heinrich » 20.08.2013, 18:18

Da fragst du noch? :D :D

Würde mich über die Details freuen.

Gruß Thomas

matze-pe
Beiträge: 757
Registriert: 11.02.2013, 08:38
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von matze-pe » 20.08.2013, 19:26

Das ist ja der Hammer :D

Richtig gute Idee, klasse umgesetzt.....sowas kenn ich bisher nur aus dem Fernsehen :D

Wenn du die Haustür öffnest, kannst du ja noch abspielen "Willkommen zu Hause Jens (übers iphone erkannt), sie haben 3 ungelesene Emails, die Pflanzen werden nachher für 7 Minuten gegossen und das Bier im Kühlschrank hat eine Temperatur von 9 Grad" 8)

Hätte ich so ein Soundsystem würde ich es auch nachbauen :lol:



Viele Grüße
CCU3 (80 Geräte, 105 Variablen, 50 Programme) * CCU.IO + DashUI + Apple HomeKit (Homebridge) auf Raspi2

art-audio
Beiträge: 712
Registriert: 13.12.2010, 09:45

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von art-audio » 21.08.2013, 08:53

Hallo,

das ist klasse!! Bitte genau dokumentieren (auch für Anfänger).

Bei uns sind auch im ganzen Haus Apple AirPort Express mit Aktivlautsprechern bzw. HiFi-Verstärkern mit Einschaltplatine für die iTunes/AirPlay Musikwiedergabe verteilt. AirFoil habe ich auch, nutze es aber nicht, da wir die Musik über AirTunes vom Mac Mini streamen und mit iPads und iPhones über die App Remote steuern.

Wir haben keine Windows-Rechner mehr, sonden nur noch Apfel-Kram.

Wenn ich es richtig verstehe, brauchen wir dann keinen MP3-Funk Gong mehr für Sprachansagen. Der liegt noch unbenutzt bei uns rum, weil mit bisher die Zeit zur Einrichtung fehlte...
Gruß

Sven

(aktuell ca. 200 HomeMatic Funk Aktoren und Sensoren und einigen Hundert Kanälen mit steigender Tendenz)

Blurline
Beiträge: 63
Registriert: 06.08.2013, 09:22

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von Blurline » 21.08.2013, 11:34

Genau das gleiche wie bei mir, allerdings habe ich mein itunes nicht auf einem macmini, sondern auf meinem PC laufen. Denke es gibt aber Wege z.B. über sh Programme auf deinem Mac zu starten ;)

t_heinrich
Beiträge: 542
Registriert: 24.07.2011, 16:38

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von t_heinrich » 21.08.2013, 14:50

Mmh ja geht mir genauso, bin auch Mac-User.

t_heinrich
Beiträge: 542
Registriert: 24.07.2011, 16:38

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von t_heinrich » 26.08.2013, 15:48

An die Mac-User:

Gibt es denn etwas Vergleichbares für uns?

Wenn ich das richtig verstanden habe, fehlt eine "Helper"-App, die dann auf dem Mac laufen müsste.

Wunschkonzert: das Ganze ohne 24h PC oder Mac :D :D

Gruß Thomas

Straight
Beiträge: 18
Registriert: 02.09.2013, 22:30

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von Straight » 03.09.2013, 19:30

Hallo Thomea,

Ziel ist es noch die Sprachwiedergabe direkt über iTunes auszulösen.
Damit würde AirFoil nicht mehr benötigt und die Ansteuerung unter MAC und
Windows wäre identisch.

Blurline und ich haben noch keinen MAC-mini im Wohnzimmer stehen,
daher gibt es hier noch keine konkrete Umsetzung dazu.

Generell habe ich mir die Umsetzung unter MAC aber einmal angesehen.
Via Apple Script und einer remote Script Steuerung ist es möglich iTunes zu steuern.

Leider ist aktuell die Doku der "iTunes COM for Windows SDK" online nicht verfügbar.
Daher wird es wohl noch etwas dauern.

Gruß
Norman

t_heinrich
Beiträge: 542
Registriert: 24.07.2011, 16:38

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von t_heinrich » 04.09.2013, 08:22

Das klingt doch schon mal gut.
Danke für die Info.

Bei direktem Anspielen über iTunes, müsste man vermutlich beachten, dass die Dateien danach wieder gelöscht werden, damit die iTunes Biliothek nicht vollläuft.

Gruß Thomas

Benutzeravatar
joni-blue
Beiträge: 1171
Registriert: 04.01.2012, 12:20
System: CCU
Wohnort: Hannover
Hat sich bedankt: 6 Mal
Danksagung erhalten: 1 Mal

Re: Dynamische Sprachausgabe mit Airplay wiedergeben

Beitrag von joni-blue » 21.09.2013, 23:42

Gibt es hie schon neues???

Bei mir vorhanden CCU1 und iMac mit iTunes.

Klappt das damit schon oder brauch ich noch mehr??


Liebe Grüße Jörn
Reboot tut gut ! ! !

Antworten

Zurück zu „Projektvorstellungen“