Voice Controlled Home

@drapple

Prinzipiell braucht Du keine IPSLibrary für die App(eigentlich arbeitet die App auch mit anderen Systemen als IPS…)

Aber Du brauchst ein Skript das den empfangenen Klartext annimmt, in IPS dann eine Aktion auslöst, und ggf. einen Text zurück gibt.

In meinen Beispielskripten habe ich die IPSLibrary eigentlich (wenn ich nicht irre) nur zum Loggen benutzt.
Wenn Du also keine installiert hast, brauchst Du eigentlich nur die IPSLog Aufrufe/Includes in den Skripten entfernen.

Wobei ich allerdings sagen muss, die IPSLibrary ist schon eine sehr coole Sache :wink:

Hm, ich habe die IPSL… entfernt aus den Scripten, aber ich bekomme keine Daten in IPS rein :frowning:

Wenn ich über diese URL :

http://192.168.0.11:3777/user/aivc.php?cmd=0&id=AliceTest&par=text

Es aufrufe kommt nur eine leere Seite und die trigger.php wird in IPS ausgelöst…

Aber wie könnte ich zum testen mal einen Text in IPS reinbekommen ?

Die Trigger.php wird in PS aber ausgelöst. wo könnte nur der Fehler liegen :frowning:


Hallo drapple,

also als erstes mal, wenn du in die aivc.php reinschaust findest Du diese Stelle

switch ($id)
{
case „AliceTest“:
$SpeechInputID = 57283; // Variable für das Device AliceTest Sprache rein
$SpeechOutputID = 15556; // Variable für das Device AliceTest Sprache raus
$contextId = 22278; // // Variable für das Device AliceTest interne Daten, in welchem Raum befindet sich das Tablet
break;
case „TabWZ“:
break;
case „TabBüro“:
break;
}

Hast Du die IDs angepaßt ? Hast Du die Variablen angelegt ? Wobei hier nur SpeechInputID und SpeechOutputID wichtig sind, die Context Variable ist mein Eigenbau.

Dann solltest Du in den Variabeln in IPS bei Aufruf schon den Eingabe und Ausgabe Text sehen.

Hi klar habe ich das gemacht :

<? 
//der folgende Link wird per app aufgerufen und hier entsprechend ausgewertet 
// http://ip:port/user/aivc.php?cmd=0&id=AliceTest&par=text
//die Variable "cmd" 0 bedeutet SpeechSystem, weitere denkbar
//die Variable "id" enthält die Device-ID 
//die Variable "par" gibt den gesprochenen Text an
$cmd = $_GET["cmd"]; 
$id = $_GET["id"]; 
$par = $_GET["par"];

IPS_LogMessage('AIVC', $cmd.' '.$id.' '.$par);


switch ($id)
{
	case "AliceTest":
		$SpeechInputID = 15951; // Variable für das Device AliceTest Sprache rein
		$SpeechOutputID = 43285; // Variable für das Device AliceTest Sprache raus
		$contextId = 22143; // // Variable für das Device AliceTest interne Daten,in welchem Raum befindet sich das Tablet 

setvalue($SpeechInputID,$par);


	break;

	case "TabWZ":
	break;

	case "TabBüro":
break; 
}

switch($cmd) 
{ 
	case 0:

	// Nun das zweite Skript mit der ID (bitte anpassen) aufrufen (trigger.php)
	IPS_RunScriptWaitEx (23705 , Array("DeviceID" => $id, "TextIn" => $par, "TextOutId" => $SpeechOutputID));
	echo GetValueString($SpeechOutputID);

	break;
} 
?>

Und so sieht IPS aus:

Aber es passiert nichts in IPS ! Kein Input und kein Output :frowning: nur die Trigger.php wird ausgeführt :frowning:

Wollen wir mal einen Fernadministration machen ?

Moin,

wollte das ganze auch mal testen. Hänge aber an der selben stelle. Das Trigger script wird ausgeführt und der Befehl auch in der Konsole erkannt, nur die variablen werden nicht gefüllt und es kommt keine Antwort :0(

Hilfe ;0)

Andreas

Da wir die Lösung mitllerweile gefunden haben

im aivc Skript

diese Zeile mit einem anderen Parameter Namen benutzen
also z.B. wird aus
IPS_RunScriptWaitEx (23705 , Array(„DeviceID“ => $id, „TextIn“ => $par, „TextOutId“ => $SpeechOutputID));
dann
IPS_RunScriptWaitEx (23705 , Array(„DeviceID“ => $id, „TextIn“ => $par, „ausgang“ => $SpeechOutputID));

und im Trigger Skript dann nochmals anpassen

also aus

$TextOutId = $_IPS[‚TextoutId‘];

wird dann

$TextOutId = $_IPS[‚ausgang‘];

@drapple: Korrigier mich wenn ich was vergessen habe, aber ich glaube das war die Ursache

klappt immer noch nicht :0/

Avic

<? 
//der folgende Link wird per app aufgerufen und hier entsprechend ausgewertet 
// http://ip:port/user/avic.php?cmd=0&id=AliceTest&par=text
//die Variable "cmd" 0 bedeutet SpeechSystem, weitere denkbar
//die Variable "id" enthält die Device-ID 
//die Variable "par" gibt den gesprochenen Text an
$cmd = $_GET["cmd"]; 
$id = $_GET["id"]; 
$par = $_GET["par"];

IPS_LogMessage('AIVC', $cmd.' '.$id.' '.$par);


switch ($id)
{
	case "AliceTest":
		$SpeechInputID = 35573; // Variable für das Device AliceTest Sprache rein
		$SpeechOutputID = 42981; // Variable für das Device AliceTest Sprache raus
		$contextId = 35078; // // Variable für das Device AliceTest interne Daten, in welchem Raum befindet sich das Tablet
	break;

	case "TabWZ":
	break;

	case "TabBüro":
break; 
}

switch($cmd) 
{ 
	case 0:

	// Nun das zweite Skript mit der ID (bitte anpassen) aufrufen (trigger.php)
        IPS_RunScriptWaitEx (32409 , Array("DeviceID" => $id, "TextIn" => $par, "ausgang" => $SpeechOutputID)); 
	echo GetValueString($SpeechOutputID);

	break;
} 
?>

Trigger.php

<?
include "SpeechServer.inc.php";

$DeviceID = $_IPS['DeviceID'];
$TextIn = $_IPS['TextIn'];
$TextOutId = $_IPS['ausgang'];

$result = Parse($TextIn, $SpeechOutputID, $contextId);
IPS_LogMessage("Sprachsteuerung",   $result);
?>

Habt ihr noch ne Idee ?

Vg

Andreas

Bei der Frage „Wie spät ist es“ wird übrigens das „ä“ nicht erkannt. Wo muss ich auf UTF8 umstellen ?!

So also wenn ich die Variable manuell einsetze in den SpeechServer klappt es

SetValueString(42981 /*[Hardware\System\Voice Control\OutSpeech]*/, $answer);

Mal was anderes … kannst du vielleicht mal ein beispiel geben wie ich eine Homematic Lampe oder Rolladen damit steuere … bzw. wo ich den Befehl dazu einfügen muss ?!

Danke

Andreas

Aber sicher,

ich sitze gerade eh an der Umlautbewätligung. :wink:
Ist dann mit dem nächsten Update drin, was wohl im Laufe der Woche kommen wird.

Ich stelle mal morgen im Laufe des Vormittags neue (aufgeräumte) Versionen der Skripte hier rein.
Dann erklär ich mal ausführlich (ich nehm mir schon wieder viel vor ,-) wie das mit den
Sprachbefehlen und den Kommandos funktioniert.

Viele Grüße

Danke ! Ich freu mich drauf :0) Bis jetzt super Arbeit !!!

So dann wie versprochen hier alle überarbeiteten Skripte.

Zuerst das AIVC.php Diese liegt ~\Webfront\User.
Es wird direkt von der APP aufgerufen und sieht nun so aus


<? 
//der folgende Link wird per APP aufgerufen und hier entsprechend ausgewertet 
// http://ip:port/user/avic.php?art=1&id=123456&par=0 

//die Variable "cmd" hat 1 für Schalten, 2 für Move , 3 für Skript ausführen , 0 SpeechSystem
//die Variable "id" enthält die IPS-ID (z.B. des Skriptes oder des EIB-Schlaters) 
//die Variable "par" gibt den Schaltzustand an 0=aus, 1=ein 

$cmd = $_GET["cmd"]; 
$id = $_GET["id"]; 
$par = $_GET["par"]; 

IPS_LogMessage('AIVC', $cmd.' '.$id.' '.$par);
switch ($id)
{
	case "AliceTest":
		$SpracheReinId = 57283;			//VariableId für Spracheingabe als Text
		$SpracheRausId = 15556;			//VariableId für Sprachausgabe als Text
		$ContextId = 22278;				//VariableId für Zusatz Informationen, wie z.B. Ort/Raum etc.
	break;
	/* Weitere Geräte jeweils mit eigenen anderen Variablen */
	case "AliceWZ":
	break;

	case "AliceBüro":
	break;
}

switch($cmd) 
  { 
      case 0: // nun -> SpeechServer
		SetValueString($SpracheReinId,$par);
		IPS_RunScriptWaitEx (52716 /* Id für das Trigger Skript */, Array("DeviceId" => $id, "SpracheReinId" => $SpracheReinId, "SpracheRausId" => $SpracheRausId, "ContextId" => $ContextId));
		echo GetValueString($SpracheRausId);
	  
	  break;
  } 
?>

Ich habe hier sämtliche Id Angaben umbenannt, damit es keine Kollisionen mehr mit vorhanden gibt.
Ausserdem wird nun die Spracheingabe gefüllt

Dieses wird vom ersten Skript aufgerufen und reicht die Parameter einfach nur weiter an eine Funktion, die vorher includiert (hinzugeladen) wird. Diese wird vom ersten Skript via Id aufgerufen, also im ersten Skript die IDs anpassen (natürlich auch die, der Variablen)


<?
include "SpeechServer.inc.php";

$DeviceId = $_IPS['DeviceId']; 				//Geräte Name des Tablets, Handy, Uhr, etc...
$SpracheReinId = $_IPS['SpracheReinId'];	//Id für die Variable -> eingesprochener Text
$SpracheRausId = $_IPS['SpracheRausId'];	// Id für die Variable -> zu sprechender Antwort Text	
$ContextId = $_IPS['ContextId'];			// Id für die Variable mit Zusatz Informationen

$result = Parse($SpracheReinId, $SpracheRausId, $ContextId);
IPS_LogMessage("Sprachsteuerung",   $result);
?>


Der „technische“ Kern.

Hier wird geprüft, ob ein Sprachkommando mit einem in den Regeln übereinstimmt und dann das entsprechende Kommando ausgeführt wird


<?

include_once "Grammar.inc.php";
include_once "Commands.php";

//Funktion holt sich den eingesprochenen Text, Vergleicht ihn mit
// den hinterlegten Regeln, um zu entscheiden welche Code Routine aufgerufen wird
function Parse ($SpeechInputID, $SpeechOutputID, $ContextId)
{
	$grammar = GetGrammar();		//Sprachregeln

	$SpeechInput = utf8_decode(GetValueString($SpeechInputID));		// Text holen, Umlaute wandeln

   IPS_LogMessage("Sprachsteuerung", 'SpeechInput=" '.$SpeechInput.'" Ort: '.$ContextId);

	// Alle Nummern aus dem InputString ermitteln. Liefert ein Array $numbers
	// mit allen gefundenen Zahlen als Float-Werte oder false.
	$minusspeech = array(" Minus ", " minus ", "- ");
	preg_match_all("/-?\d+(,|\.)?\d*/", str_replace($minusspeech, "-",$SpeechInput), $numbers);
	if(isset($numbers[0][0]))
	{
		$numbers = $numbers[0];
   	for ($i = 0; $i < count($numbers); $i++)
		{
   		$numbers[$i] = floatval(str_replace(',', '.' , $numbers[$i]));
   		IPS_LogMessage("Sprachsteuerung", '  $numbers['.$i.']='.$numbers[$i]);
		}
	}
	else
	{
		$numbers = false;
  		IPS_LogMessage("Sprachsteuerung", '  $numbers=false');
	}

	// Alle Einträge des $config Arrays werden auf Übereinstimmung mit dem Speech-Satz geprüft
	$config_count = 0;
	foreach ($grammar as $element)
	{
		$config_count++;
		$check_command = true;
		$answer = "";
		IPS_LogMessage("Sprachsteuerung", 'CONFIG'.$config_count);
   	// Prüfe REGEX1 - REGEXxx auf Übereinstimmung
   	for ($i = 1; $i < 100; $i++)
		{
			@$RegEx = $element['REGEX'.$i];
      	if(empty($RegEx))
			{
				break; // Abbruch da REGEXx Eintrag nicht vorhanden ist
			}
			else
			{
		   	if(preg_match('/'.$RegEx.'/i', ' '.$SpeechInput.' '))
				{
					IPS_LogMessage("Sprachsteuerung", '  REGEX'.$i.'['.$RegEx.']=true');
				}
				else
				{
					IPS_LogMessage("Sprachsteuerung", '  REGEX'.$i.'['.$RegEx.']=false');
            	// Ein REGEXx Eintrag wurde nicht gefunden. Prüfung auf COMMAND wird nicht durchgeführt
					$check_command = false;
				}
      	}
		} /*FOR*/

		if($check_command == true)
		{
			// Alle REGEX wurden gefunden, suche jetzt nach den COMMAND Ausdrücken
      	for ($i = 1; $i < 100; $i++)
			{
				@$RegEx = $element['COMMAND'.$i]['REGEX'];
				if(empty($RegEx))
				{
					break; // Abbruch da COMMANDx Eintrag nicht vorhanden
				}
				else
				{
					if(preg_match('/'.$RegEx.'/i', ' '.$SpeechInput.' '))
					{
						IPS_LogMessage("Sprachsteuerung", '    COMMAND'.$i.' REGEX['.$RegEx.']=true');
						$code = $element['COMMAND'.$i]['CODE'];
						$say = $element['COMMAND'.$i]['SAY'];
						IPS_LogMessage("Sprachsteuerung", '      Execute CODE :'.$code);
               	// Script in CODE ausführen...
						IPS_LogMessage("CodeBefore",$code);
						$code = str_replace ( "###CONTEXTID###", $ContextId , $code);
               	IPS_LogMessage("CodeReplaced",$code);
               	eval($code);
               	// Variablen in SAY auflösen...
						eval("\$say = \"$say\";");
						IPS_LogMessage("Sprachsteuerung", '      SAY : '.$say);
						$answer = $say;
						break;
					}
					else
					{
						IPS_LogMessage("Sprachsteuerung", '    COMMAND'.$i.' REGEX['.$RegEx.']=false');
					}
         	}
			} /* FOR */
		}
		if($answer != "") break; // Abbruch da passendes Element aus Config gefunden wurde
	}/* FOR  GRAMMAR */

	// Leerer Anwortstring bedeutet nichts passendes gefunden.
	if($answer == "") $answer = 'Das kann ich nicht tun!';
	IPS_LogMessage("Sprachsteuerung", 'SpeechOutput="'.$answer.'"');
	SetValueString($SpeechOutputID, $answer);
	return $answer;
}
?>


Dieses Skript enthält die Sprachregeln, also was kann gesprochen werden, und was soll dann passieren.
Hier ist also, der Teil, den man anpassen sollte. Dazu ein paar Beispiele aus dem Skript:

Beispiel Uhrzeit:

REGEX1’ => ‚wie spät ist es|wie viel Uhr|Zeit‘,

bedeutet dass dieses Kommando ausgeführt wird, wenn der Benutzer spricht
Wie spät ist es ?“ ODER „Wie viel Uhr ist es“ ODER „Sag mir die Zeit
Es wird also nur nach den marktierten Text gesucht, wenn der gefunden wurde, ist das Kommando erstmal gültig.
Wie spät ist es in Australien“ führt ebenso zur Ausführung wie „Nenn mir eine Zeitschrift“

Danach wird das Kommando geprüft. Bei einem Kommando mit Parametern müssen noch weitere Wörter im Text vorkommen.
In diesem Beispiel ist das Parameter Regex leer (‚REGEX‘ => ’ ',), es wird also kein Parameter erwartet und die Ausführung kann losgehen.

Es wird also der Code ausgeführt, dieser steht in Code
‚CODE‘ => ‚$result = date(„H“)." Uhr ".date(„i“);‘,
Das ist eine geschachtelte Php Anweisung, also wird nun ausgeführt:
$result = date(„H“)." Uhr ".date(„i“);

Das Ergebnis wird in $result gespeichert und dann im letzten Step an die App zurückgegeben
‚SAY‘ => ‚Die aktuelle Uhrzeit ist $result‘
Und die App spricht…

Beispiel Licht schalten:

‚REGEX1‘ => ‚(Licht|Lampe)‘,

Hier steigen wir also ein wenn wir Licht oder Lampe hören.
Demnach steigen wir auch ein, wenn wir über eine Stehlampe oder Wunderlampe reden

Nun kommen wir wieder zum Parameter Regex
hier also
‚REGEX‘ => ‚an|ein|einschalten‘, im ersten Kommando
und
‚REGEX‘ => ‚aus|ausschalten‘, im zweiten.

Beide werden nun mit dem Gesprochen geprüft.

Nehmen wir mal diese vier Beispiele aus der Praxis
Wie man sieht, kommt überall Licht oder Lampe drin vor, also brauchen wir nur noch die Parameter überprüfen

  1. „Bitte schalte das Licht ein“
  2. „Die Wunderlampe war aussergewöhnlich“
  3. „Licht aus“
  4. „Der Blinker macht das Licht an, aus, an, aus“

Zu 1) Hier gilt das erste Kommando denn es wurde hier ein gefunden
Zu 2) Hier gilt das zweite Kommando denn es wurde hier aussergewöhnlich gefunden
Zu 3) Hier gilt das zweite Kommando denn es wurde hier aus gefunden
Zu 4) Hier gilt das erste Kommando denn es wurde hier an gefunden, die zweite Regel kommt nicht mehr zum Einsatz

Es wird also ausgeführt:

  1. Set_Light (###CONTEXTID###, true);
  2. Set_Light (###CONTEXTID###, false);
  3. Set_Light (###CONTEXTID###, false);
  4. Set_Light (###CONTEXTID###, true);

<?

function GetGrammar ()
{
$grammar = array(

	array('REGEX1' => 'wie spät ist es|wie viel Uhr|Zeit',
			'COMMAND1' => array(
	   		'REGEX' => ' ',
	   		'CODE' => '$result = date("H")." Uhr ".date("i");',
	   		'SAY' => 'Die aktuelle Uhrzeit ist $result'
			)
	),
/*  Licht */
	array(
    	'REGEX1' => '(Licht|Lampe)',
    		'COMMAND1' => array(
      		'REGEX' => 'an|ein|einschalten',
        		'CODE' => 'Set_Light (###CONTEXTID###, true);',
        		'SAY' => 'Ich habe das Licht eingeschaltet'
      	),
    		'COMMAND2' => array(
      		'REGEX' => 'aus|ausschalten',
        		'CODE' => 'Set_Light (###CONTEXTID###, false);',
        		'SAY' => 'Ich habe das Licht ausgeschaltet'
      	)
   ),
   
   
   /* Temperaturen */
	array(
    	'REGEX1' => '(wie|welche|sag)?.+Temperatur',
    		'COMMAND1' => array(
      		'REGEX' => ' Kinderzimmern ',
        		'CODE' => '
         	 	$result = GetValue(34877);
         	 	$result = number_format($result, 1, ".", "");
         	 	$result1 = GetValue(24999);
         	 	$result1 = number_format($result, 1, ".", "");
         	',
        		'SAY' => 'In Aarons Zimmer beträgt die Temperatur $result Grad, in Dankens Zimmer beträgt die Temperatur $result1 Grad'
      	),
    		'COMMAND2' => array(
      		'REGEX' => ' Aarons Zimmer ',
        		'CODE' => '
					$result = GetValue(34877);
         	 	$result = number_format($result, 1, ".", "");
         	',
        		'SAY' => 'In Aarons Zimmer beträgt die Temperatur $result Grad'
      	),
    		'COMMAND3' => array(
      		'REGEX' => ' Duncans Zimmer ',
        		'CODE' => '
         	 	$result = GetValue(24999);
         	 	$result = number_format($result, 1, ".", "");
         	',
        		'SAY' => 'In Dankens Zimmer beträgt die Temperatur $result Grad'
      	),
    		'COMMAND4' => array(
      		'REGEX' => ' Wohnzimmer ',
        		'CODE' => '
         	 	$result = GetValue(16576);
         	 	$result = number_format($result, 1, ".", "");
         	',
        		'SAY' => 'Im Wohnzimmer beträgt die Temperatur $result Grad'
      	),
		   'COMMAND5' => array(
      		'REGEX' => ' ',
        		'CODE' => '',
        		'SAY' => 'Bitte spezifizieren Sie Ihre Anfrage'
      	),


   ),
   
   /* Globales */
   
	array(
    	'REGEX1' => ' Alle ',
    	'REGEX2' => ' Lichter ',
    		'COMMAND1' => array(
      		'REGEX' => ' aus | ausschalten ',
        		'CODE' => '
         	 	$result = MyFunctionAllLightsOff();
          	',
        		'SAY' => '$result'
      	)
   )
);

return $grammar;
}
?>


Woher weiss nun IPS was es tun soll.
Im vorherigen Skript haben wir diese drei Befehle gesehen

  1. $result = date(„H“)." Uhr ".date(„i“);

  2. Set_Light (###CONTEXTID###, true);

  3. Set_Light (###CONTEXTID###, false);

  4. Dieser Befehl ist harmlos, den kann PHP von Haus aus.
    2&3) Hier wird nun eine Funktion Set_Light gesucht.
    Diese findet sich in der Commands.php

function Set_Light($ContextId, $power)

Hier können also bei Bedarf eigene Funktionen hinzugefügt werden und dann den Sprachkommandos zugewiesen werden.

Nun sieht das aber mit dem ###CONTEXTID### doch recht merkwürdig aus, was ist das ?

Ich habe mir überlegt wie ich das Licht in einem Raum schalten will,
dazu habe ich in diesem Raum ein Tablet an der Wand hängen.

Wenn ich nun im Wohnzimmer sage „Deckenlampe an“ ist es einfach, da kann ich dann das Sprachkommando


array(
    	'REGEX1' => '(Deckenlampe Wohnzimmer)',
    		'COMMAND1' => array(
      		'REGEX' => 'an|ein|einschalten',
        		'CODE' => 'Set_LightDeckenlampeWZ ( true);',
        		'SAY' => 'Ich habe das Licht eingeschaltet'
      	),
    		'COMMAND2' => array(
      		'REGEX' => 'aus|ausschalten',
        		'CODE' => 'Set_LightDeckenlampeWZ(  false);',
        		'SAY' => 'Ich habe das Licht ausgeschaltet'
      	)
   ),

definieren

und dann in der Commandos.php eintragen


function Set_LightDecklampe($power) {
HM_WriteValueBoolean ( 47111 /* IPS ID der Deckenlampe */, "STATE",$power);
}
/PHP]

Und was mach ich dann mit der Wandlampe, der Fensterbeleuchtung, der Hamsterbeleuchtung, etc ..... ?
Jeweils ein Kommando ? Das war mir zu umständlich.
In der Regel ist es doch so, dass ich mit einem Kommando auch mehrere Lampen schalten will.
Also sage ich doch dem Tablet im Wohnzimmer "Licht aus" bzw. an.
Dann sollten alle Standard Lampen im Wohnzimmer angehen.

Dazu dient die Context Variable.
Hier habe ich eine Id drin (im aivc.php skript hinterlegt).

Diese zeigt bei mir auf eine Kategorie für den jeweiligen Raum.
Unterhalb dieser Kategorie habe ich die Instanzen für den Raum liegen.
Die Funktion SetLight macht nun folgendes, 
sie nimmt die Id für die Kategorie,
durchsucht alle darunterliegenden Instanzen,
prüft ob die Instanz eine Variable [b]SpeechServer_Light_Default[/b] hat.
Wenn diese den Wert true hat, wird die Lampe geschaltet.
Ich kann also im Wohnzimmer sagen "Licht an" und 
die Deckenbeleuchtung geht an,
die Wandbeleuchtung geht an

aber die Fensterbeleuchtung nicht und der Hamster wird auch nicht gegrillt ;-)

Also ein einfaches Beispiel wie man mit Hilfe der Context Id, den Raum (oder was auch immer) identifiziert und 
mehrere Aktionen anhand einer zusätzlichen (von Hand anzulegenden) Variable steuern kann.

Bleibt noch die Frage, was macht [b]Set_Instance_Power[/b] ?

Da ich sowohl FS20, Homematic als auch  Milight im Einsatz habe,
wollte ich einfach nur eine Funktion, die das Licht schaltet unabhängig der Hardware.
Dazu dient der HarwareHelper, der entscheidet welche Hardware in der Instanz vorhanden ist,
und ruft den entsprechenden Befehl auf.



```php

<?
include_once "HardwareHelper.php";

 //Fügen Sie hier Ihren Skriptquellcode ein
function Set_Light($ContextId, $power)
{
	// Wir wissen nun in welchem Raum wir sind
	// Nun alle Lichter Mit Default Kennzeichen setzen
	$children = IPS_GetChildrenIDs($ContextId);
	foreach ($children as $child) // Child ist die Instanz
	{
   	$defaultLight = IPS_GetVariableIDByName("SpeechServer_Light_Default", $child );
		if ($defaultLight)
		{
         // Wenn DefaultLight nun true ist, dann dieses Licht schalten
			if (GetValueBoolean($defaultLight))
			{
			   // Nun diesse Licht schalten
			   // Dazu testen ob
			   // HM, FS20, MILIGHT
			   
			   $typ = Get_InstanceType($child);
			   Set_Instance_Power($child, $power);
			}

    	}
	}
}
?>

Das letzte in der Reihe

<?

   function Get_InstanceType($InstanceId)
	{
    	IPS_LogMessage("Get_InstanceType", $InstanceId);
	   $InstanceData = IPS_GetInstance($InstanceId);
	   $InstanceModuleData = $InstanceData["ModuleInfo"];
	   $typ = $InstanceModuleData["ModuleName"];
	   return $typ;
   }
   
   
   function Set_Instance_Power($child, $power)
	{
		IPS_LogMessage("HardWareHelper", "Id:".$child." Power:".$power);
		$typ = Get_InstanceType($child);
		IPS_LogMessage("HardWareHelper", "Id:".$child." Typ:".$typ);
		switch ($typ)
		{
		   case "FS20":
		      FS20_SwitchMode($child, $power);
		   break;
		   
		   case "HomeMatic Device":
				HM_WriteValueBoolean ( $child, "STATE",$power);
		   break;
		   
		}
	}
?>

Hallo erstmal,

ich weiß nicht ob Sie es schon wussten,

aber ich habe da noch einige Ideen für die App.

Mein persönliches Ziel ist es, in jedem Raum ein Tablet an der Wand zu haben
und Captain Kirk/Picard/Janeway/Sisko zu „spielen“.

Das mit dem Communicator ist bereits in Arbeit, schwieriger wird das mit dem Beamen :wink:

Aber im Ernst, wenn ich in jeden Raum ein Tablet installiere, ergeben sich viele Möglichkeiten,
da die aktuellen Tablets ja einiges an Features von Haus aus mit bringen.

Gibt es hier Leute, die eine ähnliche parallele Installation planen ?
Benutzt hier jemand Wear ? Vielleicht sogar mit GPS und WLAN ? Wobei das natürlich auch über das Handy geht.
Was erhofft Ihr euch noch von der App (neben Bugfixes) ? Was plant Ihr ?

Hier mal meine Planung für die nächsten Features :

  • Anbindung Wear (KITT Mode)
  • Anbindung eines internes Netzwerkes über mehrere im Haus installierte Tablets, die dann per Wear/Handy gesteuert werden können (IPS Steuerung inbegriffen)
  • Nutzung der Tabletts für weitere Funktionen, wie z.B. Innenkameras, Bewegungsmelder, etc.
  • Musikplayer Funktionen ala Spotify
  • Ortungsfunktionen via Wear/Handy
  • ohne Ende Werbung einspielen (okay das war ein Scherz :wink: es ist und bleibt Beerware :wink: )
    to be continued …

Ich hoffe auf reges Feedback

Wünsche noch einen angenehmen Abend

Viele Grüße
Rüdiger aka Rudi

Neue Version ist unterwegs.

Android Wear Unterstützung, ab jetzt könnt Ihr also mit euer (Android) Smartwatch sprechen.

Die Wear App hat drei Seiten,

  1. Seite zum Einsprechen eines Sprachbefehls.
  2. Seite zeigt ggf. ein Bild an
  3. Zeigt als Auflistung alle Antworten an die Uhr an

Neues Kommando „Foto“, damit schießt das Tablet/Handy ein Bild, kommt das Kommando von der Uhr,
so zeigt diese das Bild auch an.

Einstellungen überarbeitet und erweitert.

Frohes Wochenende

Hallo Rudi,

ich will deine App ja auch testen. Hast Du deine App nur für Deutschland in der Google Play Developer Console freigegeben oder auch für andere deutschsprachige Länder (Schweiz/Österreich)?

Wenn ich mir deinen App Eintrag nämlich im Google Play Store anschaue sagt er mir, dass diese für keine meiner Geräte kompatibel ist (Samsung Galaxy S1, Sony Xperia Z3 Compact, Asus T300 Tablet) und unter den Details steht dann „Dieser Artikel kann im Land Ihres Gerätes nicht installiert werden“ (Ich bin aus Österreich)

Danke
LG
Thiemo

PS: Großes Lob von mir was Du hier in dieser kurzen Zeit auf die Beine gestellt hast, denn ich weiß welche Arbeit dahinter steckt und Du hast schon jede Menge Features in der App drinnen.