Android App IPSymconVoice

Freut mich zu hören. Ich habe die neue Version gestern eingereicht mit der Helper Klasse aus dem Beitrag von weiter oben den ich gepostet habe.

Einen Fehler habe ich gestern am Abend selber noch entdeckt und muss ich erst beheben. Wenn man direkt per NFC Tag die App startet und der Befehl ausgeführt wird und dann irrtümlich in das Querformat wechselt wird der Befehl noch einmal ausgeführt und wenn man wieder zurück ins Hochformat wechselt gleich auch wieder. Wenn man allerdings die App selber aufmacht und dann NFC Tags liest passiert das nicht.

Jetzt ist es praktisch perfekt! Vielen Dank!

Grüße
galleto

Erst mal RESPEKT !!!
Absolut super App und sehr gute dokumentiert.
In nur wenigen Minuten hat die Kommunikation (inkl. SSL) funktioniert.

Ich würde gerne die Ausgaben mehr bestimmen und priorisieren.
Wie kann ich das in dem Skript umsetzen??
Z.B. (Priorität von oben (wichtig) nach unten (unwichtig).

Schlagwörter: Wetter UND Temperatur => Ausgabe: Die Temperatur beträgt (12345) Grad.
Schlagwörter: Wetter UND Luftfeuchtigkeit => Ausgabe: Die Leuchtfeuchtigkeit beträgt (12346) Prozent.
Schlagwörter: Wetter => Ausgabe: Es ist (12345) Grad bei einer Luftfeuchtigkeit von (12346) Prozent.

Ich würde die Ausgabe etwas mehr „hardcoden“.
Ist das möglich?

Danke!

Habe eine für mich praktikable Lösung gefunden.
Hiermit habe ich die volle Kontrolle über die Ausgaben. :slight_smile:


 <?
//AndroidReceive ID
$input = GetValueString(55995 /*[.Skripte\Sprachsteuerung\AndroidReceive]*/  );
//AndroidSend ID
$outputid = 35288 /*[.Skripte\Sprachsteuerung\AndroidSend]*/ ;

SetValueString($outputid, "Das PHP Script wurde nicht rechtzeitig fertig");  // Initialisiere Outputstring falls die Zeitdauer in der Android App nicht ausreicht!
$SkriptStart = microtime(true);  //Setze Startzeitpunkt

// ########
// # Büro #
// ########
// "Büro" UND "Fenster"
if ((stristr($input, 'büro') !== FALSE) AND (stristr($input, 'fenster') !== FALSE))
		{
		if (GetValueBoolean(49950) == FALSE) {SetValueString($outputid, "Das Fenster im Büro ist geschlossen");}
		if (GetValueBoolean(49950) == TRUE) {SetValueString($outputid, "Das Fenster im Büro ist geöffnet");}
		}
// "Dachfenster"
if (stristr($input, 'dachfenster') !== FALSE)
		{
		if (GetValueBoolean(49950) == FALSE) {SetValueString($outputid, "Das Dachfenster ist geschlossen");}
		if (GetValueBoolean(49950) == TRUE) {SetValueString($outputid, "Das Dachfenster ist geöffnet");}
		}
?>

Perfekt :slight_smile: Eine 3te Art die IP-Symcon Input/Outputs zu realisieren. Gerade in dem php Script gibt es sicherlich noch mehr Varianten wie was zu realisieren ist. Ich habe nämlich vorhin den Beitrag gelesen und überlegt wie ich es bei mir realisieren könnte bin aber auf keinen grünen Zweig gekommen mit der Art wie mein Script aufgebaut ist.

Hallo,

mittlerweile ist die Version 1.1 (20.12.) und 1.2 (seit heute) aktiv:

Version 1.1:

  • Neu: Layouts für Tablets
  • Neu: Lese NFC-Tag im TestModus
  • Fehlerkorrektur Kopfzeile ist jetzt fixiert beim Scrollen
  • Fehlerkorrektur NFC Kommando Wechsel Hochformat/Querformat
  • Fehlerkorrektur Einstellung „Zeige erkannten Text“ funktioniert jetzt wie gewollt
  • Fehlerkorrektur Übersetzung NFC-Tag überall auf NFC-Chip für Deutsch weil das englische „Tag“ bei der Aussprache wie der Tag behandelt wird und unschön klingt :slight_smile:

Version 1.2:

  • Widget Sprachsteuerung (1x1 fix und 2x1 veränderbar); eventuell ist ein Restart des Gerätes notwendig damit das Widget sichtbar ist zur Auswahl

Ich arbeite gerade an einer Version 1.2.1:

  • da wird es dann noch ein Widget für die Textsteuerung geben (1x3 veränderbar)
    Für eine Version 1.2.2 schaue ich ob ich es schaffe per Einstellung das Android Gerät als SocketServer laufen zu lassen damit man von IP-Symcon dann über ein Script „Befehle“ senden kann. Ich denke da zB: an eine Funktioanlität um das Gerät entsprechend vom Standby wieder einzuschalten. Also wenn man ein Tablet an der Wand hat und einen Bewegungsmelder in der Nähe, dass dann über ein IPS php script entsprechend wenn der Bewegungsmelder anschlägt, den Befehl an meinen App Service sendet und dieser das Gerät vom Standby einschaltet. Ein 2ter Befehl könnte dann sein dass zusätzlich eine Sprachausgabe erfolgt wie zB: „Herzlich Willkommen“ (konfigurierbar in der App) und ein 3ter Befehl dass nach der Aktivierung des Gerätes auch gleich meine App bzgl. Sprachsteuerung aktiviert wird. Das gibt es sicherlich noch mehr Möglichkeiten.

Folgendes habe ich nach einigen Tests wieder verworfen zur Realisierung:
Im Hintergrund einen Service laufen zu lassen der so wie „OK Google“ dann die App in den Vordergrund bringt.
Grund: Es gibt so etwas nicht unterstützt über die offizielle SDK bzgl. Mithören und auf Keywörter reagieren und die 2 Lösungen die es gibt sind nicht performant genug.
Lösung A.) Android Gerät hört ständig mit und überträgt alles an Google und dort wird die Sprache umgewandelt in Text und dann fängt man das erkannte ab wenn die Zauberphrase kommt. Das Gerät wird dabei ziemlich warm, braucht entsprechend hohen Datentraffic und einiges an CPU
Lösung B.) PocketSphinx mit Voxforge Deutsch Wörterbuch; die App braucht dann statt 1.3MB gleich mal 15MB weil das Wörterbuch integriert ist; Vorteil kein Internettraffic; Nachteil schlechte Erkennung und rund ca. 10% CPU Auslastung wenn gesprochen wird

LG
Thiemo

Sehr schön, vielen Dank!

Etwas Praxis-Kritik: Das 1x1-Widget hat an zwei Seiten einen unschönen Rand; das 2x1-Widget könnte deutlich kleinere Schrift vertragen.

Grüße
galleto

Das wäre genial - hatte mir überlegt, ein Tablet mit Edelstahlrahmen in die Wand einzulassen und im Rahmen einen Taster zu integrieren. Wenn ich den dann betätige, würde der Tastendruck vom IP-Symcon erkannt und könnte die Aufforderung zur Befehlseingabe veranlassen und dann auf die Spracheingabe warten :slight_smile:

Bei welchen von den beiden Devices tritt es denn auf?
Odys Next oder S4 mini aus deiner Signatur oder bei einem anderen?
Mit den runden Ecken bei den Widgets bin ich jetzt leider voll in der Android Fragmentierung drinnen, sodass ich wohl für jede Bildschirm Größe ein eigendes Design entwerfen muss :frowning: Aber eckige haben mir nicht gefallen. Eventuell werde ich aber nochmal zurück gehen auf eckiges Design und eventuell halb transparent dann damit das blau nicht ganz so aufträgt. Denn es ist doch sehr aufdringlich.

Beim S4 mini.
ScreenshotS4mini.jpg

Ansonsten würde ich für die grafische Gestaltung keine größere Energie verschwenden. Die vorhandene Funktionalität stellt das Design sowieso in den Schatten. :wink: Aber ich bin da vielleicht auch genügsamer als andere.

Grüße
galleto

  1. Habe auf dem Galaxy S5 auch das Darstellungsproblem beim 1x1 Widget.
    Vorschlag: Einfach nur das Mic-Symbol, rest Transparent wäre sicher auch optisch ansprechend.
    (Tipp nebenbei: Ich verwende für meine Projekte die Icons von Glyphicons. Faire Lizenz zu sehr gutem Preis/Leistungsverhältnis).

  2. Hätte gerne die Möglichkeit nach der Ausführung eines Befehls eine Bestätigung an das Smartphone zu pushen. Wenn ich z.B. das Garagentor schließen lasse („Garage schließen“) erhalte ich zuerst mal die Bestätigung daß der Befehl ausgeführt wird („Garagentor wird jetzt geschlossen“). Das Schließen des Tors dauert etwa 10-15 Sekunden und ich würde gerne dann noch die Bestätigung („Garagentor geschlossen“) bekommen wollen. Idee???

Ansonsten wirklich super App !!!
Danke dafür.

Servus

ich wollte die „Haussteuerung“ App grad mal antesten, doch leider scheint sie mit meinem alten Galaxy S I9000 (Android 4.4.2, Google Now funktioniert) ein Problem zu haben:
Kommunikation mit IPS per Textsteuerung funktioniert, auch von IPS zur App.
Doch wenn ich den Sprachsteuerungsbutton drücke so stürzt sie ohne irgendeinen Hinweis einfach ab.

Aber was anderes: wofür verwendet ihr das eigentlich ?
Gut und schön für Demozwecke ist das ja ganz nett und bringt sicher viele AHHH und OHHH. Aber im täglichen Leben ?

Handy suchen > entsperren -> App starten -> „sprechen“ nur um einen Befehl auszuführen ?

Wobei ich sagen muß ich hab mehrere Tabletts in den Räumen hängen, und mein Webfront per Floorplan so gestaltet das mit typischerweise einem, höchtens zwei Tastendrücken alles relevante zu erreichen ist.
Irgendwie fehlt mir da der Benefit, insbesondere wenn ich noch an möglichen Spracherkennungsprobleme durch Ausspreche und Nebengeräusche denke.

Helft mir auf die Sprünge, Spracherkennung finde ich cool, aber was tun damit ?

greez
bb

@mr_cg
Kannst Du Dir nicht einfach eine normale Push-Nachricht senden, wenn das Garaschentor nach einem Sprachbefehl geschlossen ist? Ein durch die Tor-Variable getriggertes Skript könnte prüfen, ob der letzte Sprachbefehl weniger als 20 Sekunden her ist. Oder Du setzt mit dem Sprachbefehl auch eine Hilfsvariable und wertest sie nach dem Schließen des Garagentors aus.

@bbernhard
Mein Handy ist praktisch immer in direkter Reichweite, Entsperren funktioniert zuhause (im WLAN) nur per kurzem „Wischer“. Kurz gefasst: Ein Griff, ein Wisch, ein Klick - und schon kann ich Lichter schalten, Temperaturen abfragen, Fenster/Türen kontrollieren, die Heizung regeln, die Squeezebox steuern, …

IPS-Sprachsteuerung halt. Vor allem im „Ruhe-Modus“ (am Rechner, auf der Couch, beim Essen, …) einfach genial. Und die Erkennungsquote ist richtig gut. - Wenn ich durchs Haus laufe, nehme ich natürlich auch das Webfront im Flur oder die Lichtschalter. Jedenfalls wenn kein Beusch da ist. :smiley:

Grüße
galleto

Fehlt noch ein Widget für den Lockscreen, und dann entfällt sogar noch ein Schritt :smiley:
Michael

@ galleto
Ich möchte die 2. Bestätigung auch vorgelesen haben und nicht als Push Text-Nachricht.

@ bbernhard
Das Handy suchen, entsprerren und die App starten kann Dir auch die IPS App nicht abnehmen.
Aber mit nur einem Klick können alle Funktionen verwendet werden ohne im Menü navigieren zu müssen.
Ideal für die Verwendung im Auto. Funktioniert bei mir zumindest perfekt.

Okay, dann könnte das eine (zukünftige) Möglichkeit sein:

Vielleicht lässt sich das ausbauen, um vielleicht ne handvoll voreingestellte Texte auszulösen.

Grüße
galleto

Welches ROM hast Du denn da drauf? Ich habe auch ein altes I9000 rum liegen mit 4.1.1 mit dem ich Live ohne Simulator testen kann ob es auch für ältere Android Versionen funktioniert (alte Cyanogenmod Version). Könnte das aber testweise mit einem anderen ROM benutzen um es so live zu testen.

So eine neue Version 1.2.2 ist unterwegs.

Es ist damit möglich in einem eigenen App Reiter das Android Gerät als Server agieren zu lassen um somit von IP-Symcon Befehle empfangen zu können.

Hier das Script:

<?

//Script Datum: 25.11.2016 Version 1.5

/* 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.49';

//Befehle für Android Gerät (je nach Bedarf Zeilen deaktivieren/verändern)
// $in = ""; als erste Zeile immer stehen lassen
//
// WICHTIG: Wenn PasswortProtection in der App Haussteuerung aktiviert wurde, dann ist bei jedem Kommando ein "PW passwort" voranzustellen
// WICHTIG: Beispiel sieht dann so aus:
// WICHTIG:    $in .= "PW AndieserStellekommtdeinPasswort Sage Das ist ein Test
";

// 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!
// Sage1 XXX                   wie oberhalb aber mit geringer Lautstärke
// Sage2 XXX  bis Sage4 XXX    wie oberhalb aber mit höherer Lauftstärke bis beinahe maximaler Laufstärke
// Sage5 XXX                   wie oberhalb aber mit maximaler Lautstärke
// 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
// Spracheingabe               Startet die Sprachsteuerung der App am Android Gerät im Hintergrund aber ohne Auslesen der Rückantwort von IP-Symcon
// SpracheingabeUndAntwort     Startet die Sprachsteuerung der App am Android Gerät im Hintergrund inkl. Auslesen und Vorlesen der Rückantwort von IP-Symcon
// ÖffneUrl xxx                Öffnet eine URL am Android Gerät
// Tasker xxx                  Startet den Tasker Task mit dem Namen xxx (WICHTIG: In Tasker unter Einstellungen -> Versch. -> Externen Zugriff erlauben einstellen!)
// Vibriere NNNN Millisekunden lässt das Android Gerät für NNNNN Millisekunden vibrieren (1000 Millisekunden = 1 Sekunde)
// 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))
// StarteWebcam                Starte eingebaute WebCam der App Haussteuerung (funktioniert nur wenn das explizit in der App unter Einstellungen WebCam erlaubt wird)
// StoppeWebcam                Stoppe eingebaute WebCam der App Haussteuerung (funktioniert nur wenn das explizit in der App unter Einstellungen WebCam erlaubt wird)
// WICHTIG immer mit 
 abschließen und $in mit .= erweitern!!!

$in = "";   //nicht löschen!!!
//$in .= "PW q3R$z6R& DeaktiviereStandby
";    //Beispiel um mit Passwort zu arbeiten
$in .= "DeaktiviereStandby
";
$in .= "Warte 500
";
//$in .= "SagenachStandby Das ist ein Test
";
//$in .= "SageohneStandby Auch das ist ein Test
";
//$in .= "Sage Das licht ist draußen an wollen sie es ausschalten
";
$in .= "Sage1 Das ist ein Test ganz leise
";
//$in .= "Sage4 Das ist ein Test ziemlich laut
";
//$in .= "Sage Das ist wieder normale Lautstärke
";
//$in .= "Spracheingabe
";
//$in .= "SpracheingabeUndAntwort
";
$in .= "ÖffneUrl http://www.google.at
";
//$in .= "ÖffneUrl skype:thiemo99999?call&video?true
";
$in .= "Tasker Testthiemo
";
//$in .= "Sage Ich starte jetzt die App haussteuerung
";
//$in .= "StarteApp haussteuerung
";
//$in .= "Herunterfahren
";
//$in .= "Restart
";
//$in .= "Sage Ich starte jetzt IP-Symcon
";
//$in .= "StarteAppnachStandby ip-symcon
";
//$in .= "Vibriere 3000
";
//$in .= "PW q3R$z6R& StarteWebcam
";    //Beispiel um mit Passwort zu arbeiten
//$in .= "StoppeWebcam
";

//ab hier jetzt nichts mehr verändern!!!
$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.
";

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

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

";

?>

Folgende Hinweise:

  • Wenn WLAN im Standby abgeschaltet wird laut den Android Einstellungen dann ist das Gerät natürlich nicht mehr erreichbar
  • beim Standby Deaktivieren bleibt der Sperrbildschirm des Android Gerätes aufrecht!!! Lässt sich mit der Android SDK nicht umgehen
  • bei sehr vielen installierten Apps kann es dauern bis der Server gestartet ist wenn man auf den Start Button drückt (zB: bei 400 installierten Apps ca. 10 Sekunden; bei 40 Apps ca. 1 Sekunde); es wird nämlich eine Liste der installierten Apps gehalten da sonst jeder Versuch eine App zu starten so lange dauern würde!
  • für Herunterfahren/Restart sind Root Rechte erforderlich (rooted Device)
  • sollte das Android Gerät wenig RAM haben und sehr viele Apps/Services schon laufen, kann es sein dass der Server ständig von Android beendet wird und wieder neu gestartet wird. Das liegt daran dass Android intern eine Bewertung bzgl. Wichtigkeit durchführt und aufgrund dieser bei Speicherbedarf Tasks entsprechend beendet. Eventuell habt Ihr auch irgendwelche Tasker am Laufen die dann auch den Server (Service) beenden und so es zu Restarts kommt. Der Server sollte in der App gestartet und gestoppt werden bei Bedarf
  • bewährt hat sich bei meinen Tests eine Zusatz App um diverse App Informationen und Tasks usw… anzuzeigen (System Info for Android)
  • die neue Berechtigung ist notwendig, wenn die Einstellung „Start beim Booten“ in der App aktiviert wird, damit der Server beim Neustart des Gerätes automatisch mit gestartet wird! Der Server ist nicht als eigener Prozess sichtbar, sondern lauft in der Haussteuerung mit (ursprünglich wollte ich es in einem eigenen Prozess realisieren mit dem Namen „Haussteuerung Remote“, dann hatte ich aber Probleme mit dem Socket bzgl. Terminierung und das wieder verworfen)

Eine schöne Sache - habe schon lange nicht mehr soviel mit meinem Handy gesprochen :D. Vielen Dank an Thiemo für die Umsetzung.

Der Script läuft übrigens auch auf dem Raspberry, wenn man in der Funktion "SetValueUniversal() folgende Änderung durchführt:

// $VariableType = IPS_GetVariable($VariableID)[‚VariableValue‘][‚ValueType‘];
$VariableType = IPS_GetVariable($VariableID)[‚VariableType‘];

Ich habe außerdem einige kleine Ergänzungen durchgeführt, um auch DImmer zu unterstützen. Mit dem Sprachbefehl z.B. „Stelle Stehlampe im Wohnzimmer auf x Prozent“ funktioniert das auch schon ganz gut. Nur mit „Null Prozent“ habe ich noch Probleme …

Gruß
Peter

Bzgl. der Server Funktion habe ich noch eine Optimierung programmiert (Version 1.2.3 ist unterwegs)

Folgende Logik wird nämlich durchlaufen beim Starten:
a.) Eröffnen eines Service
b.) Im Service wird ein Thread erzeugt
c.) In diesem Thread wird dann der Socket Server gestartet und selbst regelmäßig kurz neu gestartet damit ein stoppen von außen überhaupt möglich ist (sonst blockiert der Port IO und wird nie abgebaut und bei Neustart des Service gibt es einen Fehler)

Jetzt kann es aber offensichtlich irgendwann passieren, dass Android den Thread beendet (Speichermanagement/Selbstverwaltung). Dann lauft zwar der Service weiter und wird auch als gestartet angezeigt, aber im Hintergrund gibt es den Thread nicht mehr und somit auch nicht mehr den Socket Server der auf dem Port lauscht.

Im Service gibt es jetzt ein Monitoring alle 10 Sekunden ob der Thread noch lauft und wenn er nicht mehr lauft wird er erneut gestartet. (mit der Version 1.2.3 die in den nächsten Stunden im Playstore verfügbar sein wird)

Ein Bugfix wurde auch noch behoben bzgl. Socket Terminierung. Folgendes führte nämlich dazu, dass der Socket Server gar nicht mehr lief. Getestet auf meinem Galaxy S3

a.) Haussteuerung App Starten und im Reiter Server den Server starten - dauert dort ca. 10 Sekunden weil ich rund 400 Apps drauf habe, wobei ich wahrscheinlich 10 regelmäßig nutze :slight_smile:
b.) Im Activity/Taskmanager (langes drücken auf Home Taste) die App wegwischen - dann dauert es ca. 15 Sekunden bis der Service im Hintergrund wieder fertig neu gestartet ist (5 Sek + 10 Sek. Apps laden)
c.) danach App wieder starten und im Reiter Server den Server stoppen und neu Starten, das führte jetzt in der Version 1.2.2 nach dem Starten des Thredas zu einem unmittelbaren Interrupt des Threads und der Service lief zwar aber der Thread nie mehr. Egal wie oft man jetzt gestartet/gestoppt hat

Und das Script 2 Posts weiter oben lässt sich perfekt dazu nutzen um Personen im gleichen Haushalt zu verarschen :rolleyes: wenn diese davon nichts weiß, dass ich jetzt von IP-Symcon aus Sachen am Android Gerät steuern kann :smiley:
Beinahe wäre es aus dem Fenster geflogen

LG
Thiemo