Android App IPSymconVoice

mal ne frage

Android macht das ja per Google und wandelt dann das gesprochene in text um
und anhand des Textes wird dann reagiert

frage wäre es technisch nicht denkbar das auf dem IPS Server zu machen
sprich egal welche device schickt die mic aufnahme zum Server der wertet das aus und entscheidet
und ggf natürlich in der IPS app mit drin

gruss Roman

Das würde nur Sinn machen wenn man für IPS entsprechende Software hat die den Audiostream entsprechend umwandeln kann und ich habe hier bisher noch keine Beispiele gefunden in diese Richtung. Für die Neue Version 1.2.4 die jetzt draußen ist, musste ich für das Lock Screen Widget entsprechend die Sprachsuche über einen Service realisieren da das Popup im Hintergrund nicht aufgeht und die Spracherkennung sofort automatisch wieder beendet wurde. Man ist durch den Service auch unabhängig von der Goolge App bzgl. Sprachsuche, aber es werden trotzdem die Google Server entsprechend automatisch angesprochen bzgl. Auswertung. Der Unterschied (leider) dabei ist, meine App braucht jetzt eine zusätzliche Berechigung für die Audioaufzeichnung damit das Sperrbildschirm Widget realisiert werden konnte.

Die neuen Serverbefehle sind hier zu finden:
Android App IPSymconVoice - Seite 10

Ich habe jetzt einen Homematic Bewegungsmelder im Vorzimmer der mir mit folgendem Script das Tablet an der Wand entsprechend vom Standby aktiviert, einen kurzen Text vorliest und meine App startet
In meiner App habe ich die Einstellung getroffen: „Start mit Spracherkennung = AN“ unter den Optionen „Sprechen“ damit ich dann auch gleich direkt nach dem Pieps Ton ein Kommando los werden kann:


<?

/* Den Port vom Android Device. Default 2001. Kann in der App Haussteuerung verändert werden! */
$service_port = 2001;

/* Die  IP-Adresse des Zielrechners ermitteln. */
//$address = gethostbyname('android-6f94f5f5290b2696.home');
//oder so fix setzen bei Static IP
$address = '10.0.0.6';

//hole Status
$status = GetValueBoolean(30824 /*[BM Vorzimmer oben\MOTION]*/);

if ($status == true) {
	//Befehle für Android Gerät (je nach Bedarf Zeilen deaktivieren/verändern)
	// $in = ""; als erste Zeile immer stehen lassen
	// DeaktiviereStandby          Schaltet das Display ein, ein Lcokscreen/PIN/etc... wird aber nicht übergangen!!!
	// SagenachStandby XXX         wird nur ausgefüht wenn das Android Gerät im Standby Modus war und der Bildschirm aktiviert wurde
	// SageohneStandby XXX         wird nur ausgefüht wenn das Android Gerät nicht im Standby Modus ist, also der Bildschirm schon sichtbar ist
	// Sage XXX                    einfach nach Sage einen Text konfigurieren der dann immer ausgegeben wird am Android Gerät im Hintergrund; Egoal ob Display im Standbymodus ist oder nicht!
	// Warte NNNN Millisekunden    1000 Millisekunden = 1 Sekunde (Während Wartezeit wird ein transparenter Screen angezeigt wenn das Device an ist!)
	// StarteApp XXX               (App Name immer in Kleinbuchstaben, vorhergehendes Warte hat hier keine Auswirkung!!!)
	// StarteAppnachStandby        (App Name wird nur gestartet wenn das Android Gerät im Standby Modus war und der Bildschirm aktiviert wurde
	// Herunterfahren              (benötigt ein Android Gerät mit root Rechten und der App Zugriff auf Superuser Rechte (rooted device))
	// Restart                     (benötigt ein Android Gerät mit root Rechten und der App Zugriff auf Superuser Rechte (rooted device))
	// WICHTIG immer mit 
 abschließen und $in mit .= erweitern!!!
	$in = "";   //nicht löschen!!!
	$in .= "DeaktiviereStandby
";
	$in .= "Warte 50
";
	$in .= "SagenachStandby Hallo hier spricht dein IP Symcon. Was kann ich für Dich tun
";
	$in .= "StarteAppnachStandby haussteuerung
";
	//$in .= "SageohneStandby Was kann ich für Dich tun
";
	//$in .= "Sage Ich starte jetzt die App haussteuerung
";
	//$in .= "Herunterfahren
";
	//$in .= "Restart
";
	//$in .= "Sage Ich starte jetzt IP-Symcon
";
	//$in .= "StarteApp ip-symcon
";


	//ab hier jetzt nichts mehr verändern!!!
	$in .= "
";
	$in = mb_convert_encoding($in, "UTF-8");
	error_reporting(E_ALL);

	echo "<h2>TCP/IP-Verbindung</h2>
";

	/* Einen TCP/IP-Socket erzeugen. */
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
	if ($socket === false) {
	    echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "
";
	} else {
	    echo "OK.
";
	}

	echo "Versuche, zu '$address' auf Port '$service_port' zu verbinden ...";
	$result = socket_connect($socket, $address, $service_port);
	if ($result === false) {
	    echo "socket_connect() fehlgeschlagen.
Grund: ($result) " . socket_strerror(socket_last_error($socket)) . "
";
	} else {
	    echo "OK.
";
	}

	$out = '';

	echo "HTTP request senden ...";
	socket_write($socket, $in, strlen($in));
	echo "OK.
";

	echo "Serverantwort lesen:
";
	while ($out = socket_read($socket, 2048)) {
	    echo $out;
	}

	echo "
Socket schließen ...";
	socket_close($socket);
	echo "OK.

";
}

?>

naja ips müsste den stream nicht umwandeln sondern nur empfangen und über Google zu einem Text wandeln
so könnte man von jedem Device spracherkennung haben

Bin begeistert von der App. Endlich kann man mit der „Haussteuerung“ ein Tablet aufwecken und Sprachmitteilungen ausgeben ohne Tasker, Eventghost und sonst was zu installieren.
Ich wollte auf meinem HP slate 21 pro mit Android 4.3 und auf dem Motorola xoom mit Android 4.1 die App „Haussteuerung“ installieren, aber bei beiden Tablets kann ich die Software in Google PlayStore nicht finden, heißt, ist nicht lauffähig auf den beiden. Die Vorgänger-App IPSymconVoice wird gefunden und lässt sich auch installieren.
Weiß einer Rat ?

Gruß, Rainer

Folgende Ergänzungen hätte ich noch:

Wäre praktisch wenn einerseits die App konfigurierbar im Sprachmodus bleiben könnte.
Noch besser wäre es wenn man dieses von IPS durch den SocketServer steuern könnte.

Abgedreht wird es wenn die App still und leise im Hintergrund werkeln kann und eine andere App im Vordergrund laufen würde. Ist dann vor allem für die Nachbarn und Freunde :wink:

Tolles Projekt,
habe es gleich zum laufen bekommen.
Kompliment auch für deine Debug Funktionen und die Dokumentation.

Das lässt sich so leider nicht einfach realisieren, weil die Google Sprachsuche normalerweise wieder beendet wird wenn nichts gesprochen wird bzw. wenn eine kurze Pause eintritt und das permanente zuhören und auf spezielle Wörter zu hören um zu erkennen dass jetzt ein Befehl kommt ist nicht performant, braucht zu viel Datenvolumen und man will ja schließlich nicht dadurch eine Wanze in der Wohnung/im Haus haben die schön brav alles gesprochene an Google weiterleitet.

Das ist seltsam warum es für diese Tablet nicht im Google Playstore angeboten wird.
Laut Google Developer Console werden 5406 Geräte unterstützt. Aber das HP slate 21 und das Motorola Xoom sind nicht dabei (das Xoom 2 schon).

Ich habe die letzte Version 1.2.4 zusätzlich hier hingestellt:
https://dl.dropboxusercontent.com/u/32562665/haussteuerung.apk

Bekomme auf dem Motorola xoom die Meldung, dass beim Parsen der Pakete ein Fehler aufgetreten ist.
Mit dem HP slate hab ich das Installieren noch nicht ausprobiert.

Gruß Rainer

Hi vielen Dank für deine Mühe und für dein Ehrgeiz diese App uns allen kostenlos bereit zu stellen.

Ich habe mit Tasker und Autovoice für Taker es hinbekommen, das er auf ein Keyword (z.b. skynet :rolleyes:) die APP IPSymconVoice startet und dann springt gleich die Sprachsteuerung an, dann gibt die App Ihren Senf ab und beendet sich brav.

Soweit funktioniert alles wie ich es mir vorstelle, wenn da nicht noch ein kleines Problem wäre:

Das ganze funktioniert nur gut, wenn das Handy in der nähe ist (unter 1-2m), wenn es weiter weg ist, versteht die Spracherkennung einem nicht :frowning:

Wie könnte man das hinbekommen, dass das Handy auf der Couch liegt und am anderem Ende des Raums, man trotzdem alles per Sprache steuern könnte ?

Nein, ein BT Headset ist keine Lösung ! BZW. wir nehmen ein 5€ BT Headset aus China, kaufen uns noch eine Attrappe von dem Ding was Picard an an der Brust hat, und immer darauf drückt, das er dem Computer Befehle per Sprache erteilen kann,bauen das BT Headset so um (in das Attrappen-Ding vom Picard) das hätte doch was :wink:

Oder hätte einer eine Idee wie man das besser lösen kann, am besten mit mehreren Räumen :wink:

Dann hat es wohl einen Grund warum das Motorola xoom in der Google Developer Console für die App „Haussteuerung“ bereits ausgeschlossen wird als unterstütztes Gerät. Entweder es ist ein Hardware Thema oder Software. Allerdings habe ich keine Idee falls es ein Software Thema ist, aufgrund welchen Teil es für das Motorola Xoom ausgeschlossen wird.

Just zur Info, als zur Zeit nur Mitleser (andere Baustellen wichtiger :slight_smile: )
Habe mal testhalber alte Geräte rausgekramt. Alles vor 2012 wird nicht unterstützt, auch wenn Android 4.2 drauf läuft. Ab 2012 keine Probleme mit dem Appstore.

Gruß
Manfred
via Sony Xperia Z Ultra

Sehr tolles Script, leider habe ich bei deinem nicht ganz durchgeblickt am anfang und habe mit einem eigenen angefangen :confused:
Vielen Dank für das Grundgerüst! (:

Momentan soinnt aber die Haussteuerungs app nach jedem mal Spracheingabe stürzt sie ab :confused: jemand einen Tipp?

<?
SetValueString(18573 /*[Original\Benachrichtigung\David\androidSend]*/ ,"");
# = $_IPS['ACTION'];
$id = GetValueString(53191 /*[Original\Benachrichtigung\David\androidReceive]*/ );
$t="";
$ausgabe="";
#$zeichenkette = $id;
#$suchmuster = 'Außen';
#preg_match($suchmuster, $zeichenkette, $treffer, PREG_OFFSET_CAPTURE, 3);
$v=explode("und",$id);

foreach ($v as $id)
{
if(GetValue(15313 /*[Wetter\DWD Unwetterwarnungen\DWD DEFCON Status]*/ )<=4) $ausgabe=$ausgabe."Defcon Status".GetValue(15313 /*[Wetter\DWD Unwetterwarnungen\DWD DEFCON Status]*/ );
if(preg_match("/Kugel auf/i",$id)) {if (preg_match("/\d+/", $id, $matches)) {$zahl = $matches[0]; $Zahl=(int)$zahl; ZW_DimSet(27228 /*[Original\Glas-Leuchte]*/,$Zahl); }}
if(preg_match("/Kugel aus/i",$id)) echo ZW_SwitchMode(27228 /*[Original\Glas-Leuchte]*/ ,false);
if(preg_match("/Kugel an/i",$id)) echo ZW_SwitchMode(27228 /*[Original\Glas-Leuchte]*/ ,true);
if(preg_match("/Zimmer aus/i",$id)) echo IPS_RunScript(10505 /*[David Zimmer Licht\Alles Aus]*/ );
if(preg_match("/Zimmer an/i",$id)) echo IPS_RunScript(32930 /*[David Zimmer Licht\Alles An]*/  );
if(preg_match("/Stehlampe an/i",$id)) echo ELRO_Switch(52194 /*[Original\Steh-Lampe]*/ ,true);
if(preg_match("/Stehlampe aus/i",$id)) echo ELRO_Switch(52194 /*[Original\Steh-Lampe]*/ ,false);
if(preg_match("/Schreibtisch aus/i",$id)) echo ELRO_Switch(50991 /*[Original\Steh-Lampe\Schreibtisch]*/ ,false);
if(preg_match("/Schreibtisch an/i",$id)) echo ELRO_Switch(50991 /*[Original\Steh-Lampe\Schreibtisch]*/ ,true);
if(preg_match("/LED Dunkler/i",$id)) { $t=GetValueInteger(40220 /*[Original\Aquarium LED\Intensity]*/ ); ZW_DimSet(10167 /*[Original\Aquarium LED]*/ ,$t-10);}
if(preg_match("/LED Heller/i",$id)) { $t=GetValueInteger(40220 /*[Original\Aquarium LED\Intensity]*/ ); ZW_DimSet(10167 /*[Original\Aquarium LED]*/ ,$t+10);}
if(preg_match("/LED Bunt/i",$id)) echo ZW_ConfigurationSetValue(10167 /*[Original\Aquarium LED]*/, 72, 8);
if(preg_match("/LED Normal/i",$id)) echo ZW_ConfigurationSetValue(10167 /*[Original\Aquarium LED]*/, 72, 1);
if(preg_match("/Außen/i",$id)) {$t=GetValue(56305 /*[Original\Eingang\Value\Temperatur]*/ ); $ausgabe=$ausgabe."Draußen: ".$t."° ";}
$k=GetValue(38039 /*[Original\Raum\Value\Temperature]*/ );
$temp=GetValue(18573 /*[Original\Benachrichtigung\David\androidSend]*/);
if(preg_match("/Innen/i",$id)) echo $ausgabe=$ausgabe.$temp=$temp."Drinnen: ".$k."° ";
if(preg_match("/klo aus/i",$id)) echo ELRO_Switch(18984 /*[Original\Minischalter]*/, false);
if(preg_match("/klo an/i",$id)) echo ELRO_Switch(18984 /*[Original\Minischalter]*/, true);
if(preg_match("/LED auf/i",$id)) {if (preg_match("/\d+/", $id, $matches)) {$zahl = $matches[0]; $Zahl=(int)$zahl; ZW_Basic(10167 /*[Original\Aquarium LED]*/, $Zahl); }}
if(preg_match("/Eieruhr/i",$id)) ;

#echo $id;
}
SetValueString(18573 /*[Original\Benachrichtigung\David\androidSend]*/ ,$ausgabe);
?>

Beendet sie sich einfach oder stürzt Sie mit einer Fehlermeldung ab. Wenn sie sich nur beendet hast Du eventuell in den Einstellungen unter „App“ bei „App nach Aktion schließen“ auf An gestellt. Dann beendet sich die App sobald ein Sprachbefehl, NFC-Befehl oder sonstiges gemacht wird.
Soll ein Fehler kommen wäre es gut wenn Du es an Google weiter meldest. Dann sehe ich nämlich den genauen Fehler in der Android Developer Console.

Ich habe von gestern Abend aber einen ANR Eintrag (Android not Responding) in der Android Developer Console stehen (der erste überhaupt). Ich hatte in der Vergangenheit bisher 2 Abstürze gemeldet bekommen. Ein ANR ist aber kein Absturz, sondern quasi eine Überlastung des Handys (zB: 100% CPU Auslastung) mit folgendem Titel:

ANR Input dispatching timed out (Waiting because the touched window has not finished processing the input events that were previous started) . Mit dem Inhalt darin werde ich aber nicht ganz schlau. Es wurden 7 paralle Tasks geöffnet. Hast Du zufällig ein Galaxy K Zoom (m2alte)? Dann könnte dieser ANR nämlich von Dir stammen.

Danke
LG
Thiemo

Jawohl anwesend.

Okay das heißt mein Handy ist überlastet?
Heute funktioniert es auch wieder einwandfrei.
Könnte es was mit meinem Satelliten Internet zu tun haben? Was schon recht hohe Laufzeiten aufweißt.
Vorallem abends, hm da hängts auch am meisten…, da ist es mit dem Internetzugriff meist nicht weit her…
P.s.:
Gibt es eine Möglichkeit einen Sound abzuspielen?

Das könnte sein dass es mit der Verbindung zusammen hängt, weil ja die Spracherkennung über den Google Server lauft.
Eine Möglichkeit einen Sound abzuspielen gibt es derzeit nicht.

Ich habe gerade die Version 1.2.7 veröffentlicht. Sollte in nächster Zeit verfügbar sein.

Es gibt jetzt die Möglichkeit in der Android App Haussteuerung unter den IP Symcon Settings eine Akku Variable zu hinterlegen (ID von einer Integer Variable in IP-Symcon)
Der Server Modus der Android App muss dann auch eingeschaltet sein und man kann dann mit folgendem Script entsprechend den aktuellen Akkustand des Android Gerätes von IP-Symcon aus abfragen um zB: gezielt wenn ein Wert unterschritten wird per Aktor das Tablet wieder auf 100% zu bringen oder dann eine Nachricht (zB: Bitte laden) auf dem Android Gerät mit einem anderen Script ausgeben (siehe in diesem Thread).

<?

/* Den Port vom Android Gerät. Default 2001. Kann in der App Haussteuerung verändert werden! */
$service_port = 2001;

/* Die  IP-Adresse des Anroid Gerätes ermitteln. */
//$address = gethostbyname('android-6f94f5f5290b2696.home');
//oder so fix setzen bei Static IP
$address = '10.0.0.88';

//ab hier jetzt nichts mehr verändern!!!

//Befehle für Android Gerät (Akku lesen)
// Akku                         lese Akkustand und schreibe in IntegerVariable in IP-Symcon die in der Android App hinterlegt wurde
// WICHTIG immer mit 
 abschließen und $in mit .= erweitern!!!
$in = "";      //nicht löschen!!!
$in .= "Akku";
$in .= "
";
$version = IPS_GetKernelVersion();
if ($version < "4.00") {
   $in = mb_convert_encoding($in, "UTF-8");
}
error_reporting(E_ALL);

echo "<h2>TCP/IP-Verbindung</h2>
";

/* Einen TCP/IP-Socket erzeugen. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket == false) {
    echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "
";
    exit;
} else {
    echo "OK.
";
}

echo "Versuche, zu '$address' auf Port '$service_port' zu verbinden ...";
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 3, 'usec' => 0));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 3, 'usec' => 0));
$result = socket_connect($socket, $address, $service_port);
if ($result == false) {
    echo "socket_connect() fehlgeschlagen.
Grund: ($result) " . socket_strerror(socket_last_error($socket)) . "
";
    exit;
} else {
    echo "OK.
";
}

$out = '';

echo "HTTP request senden ...";
socket_write($socket, $in, strlen($in));
echo "OK.
";

sleep(1);

echo "
Socket schließen ...";
socket_close($socket);
echo "OK.

";

?>

Zuerst ein mal! Genial umgesetzt. Top Arbeit.

Ich hab mir das Grundgerüst genommen und für meine Bedürfnisse angepasst. Auch das schalten von
vielen Leuchten in einem Raum kann man mit Fleißarbeit leicht umsetzten.

Was ich noch gern tun würde, hat nicht direkt mit der App zu tun. Ich würde das Gerät gerne mit einer Ansage ähnlich HeySiri dazu bringen, das Gerät aus dem Standby aufzuwecken und die App zu starten.

Hat das schon jemand realisiert ?

Ich bin leider zu 90% in der Apple Welt unterwegs und kenn mich daher mit Android nicht so aus :frowning:

Soweit ich weiß kann man „OK Google“ noch nicht verwenden wenn das Handy ausgeschaltet ist und nicht am Ladekabel hängt.

Aber wenn man GoogleNow konfiguriert:
“Ok Google” von jedem Bildschirm aus starten, jetzt auch auf Deutsch - AndroidPIT

Geht es zumindestens wenn es an der Ladestation hängt. Also zB: an der Wand hängt und permanent geladen wird.

Dann geht folgendes zu sagen:
a.) „OK Google“
b.) „Öffne Haussteuerung“

Und man befindet sich in meiner App. Allerdings hat man noch das Problem mit dem Sperrbildschirm den man dauerhaft deaktivieren müsste.

Einfacher wäre doch sicherlich eine Option in der App,
damit diese immer im Sprach Eingabe Modus verbleibt.

Über ein Skript kann man dann ja auswerten ob das was die App hört ausgeführt werden soll oder nicht,
also im Skript erstmal ein „Aufwachkommando“ definieren.

Und wenn die App das dann noch im Hintergrund machen könnte, hätte ich alles was ich brauche :wink:

Das wäre natürlich die General Lösung. Und am besten noch die Ansprache selber anlernen können :slight_smile: