Android App IPSymconVoice

Hallo,

ich habe die Android App „Haussteuerung“ entwickelt. Ab Android 4.1 (Aktuelle Version der App 2.6.1, Stand: 23.02.2019)
Download im Play Store: https://play.google.com/store/apps/details?id=de.ip_symcon.www.haussteuerung&hl=de

Alle Details zur App „Haussteuerung“ findet Ihr jetzt auch hier: Thiemo Redirection

Die Android App „IPSymconVoice“ für ältere Android Geräte (Aktuelle Version der App 1.2, Stand: 17.11.2014)
Download im Play Store: Nicht gefunden

Die letzte Version der Haussteuerung ist ab sofort auch immer auf meinem Dropbox Konto zu finden. Bitte alle die den Playstore haben immer über den Playstore installieren da Ihr dann auch automatisch Updates erhaltet. Bei Dropbox müsst Ihr euch selbst um Updates kümmern.
Manche Geräte werden von Google als nicht unterstützt anerkannt, obwohl auf diesen Android 4.3 etc… lauft durch zB: auch Custom Roms die dann installiert wurden.
Hier der Link zur haussteuerung.apk Datei auf dem Dropbox Konto:
Dropbox - haussteuerung.apk
Hier der Link zur haussteuerungwear.apk Datei auf dem Dropbox Konto:
Dropbox - haussteuerungwear.apk

Features

  • Sprachsteuerung von IP-Symcon (beide Apps)
  • NFC-Tags beschreiben/lesen und IP-Symcon steuern (beide Apps)
  • Textsteuerung/Abfrage von IP-Symcon (beide Apps)
  • extra Ansicht Querformat (nur Haussteuerung)
  • QR-Code Steuerung von IP-Symcon (nur Haussteuerung)
  • Links/Rechts Wischgeste für Bildschirm Wechsel (nur Haussteuerung)
  • SSL/TLS (https) Unterstützung (nur Haussteuerung) - bzgl. SSL Zertifikat hier Sonderthema wenn eigenes Webfront Zertifikat genutzt wird
  • Bildschirm individuell anpassen (nur Haussteuerung)
  • optimiert für Tablets (nur Haussteuerung)
  • Widgets für Sprachsteuerung/Textsteuerung (nur Haussteuerung)
  • Lockscreen Widget für Sprachsteuerung (nur Haussteuerung)
  • Android Gerät von IP-Symcon aus steuern (nur Haussteuerung)
    (für diese Funktion siehe Post Android Gerät fernsteuern Script)
  • Akkustand von IP-Symcon aus abfragen (nur Haussteuerung)
    (für das Script siehte Post Akkustand Script
  • Bluetooth Unterstützung (nur Haussteuerung)
  • Smartwatch Wearable Unterstützung (nur Haussteuerung)
    (für Settings Wearable siehe Post Wearable Settings
  • Location Tracking (Standortermittlung) (nur Haussteuerung); genaueres siehe Post Standortermittlung
  • Webfront Anzeige (nur Haussteuerung); genaueres siehe Post Webfront Infos
  • Offline Spracherkennung Schlüsselwörter (nur Haussteuerung)
  • WLAN Tracking (nur Haussteuerung); genaueres siehe Post WLAN Tracking
  • Integrierte Webcam; genaueres siehe Post Webcam
  • Support von Android 7.1 mit Longclick auf Haussteuerungs App Icon am Homescreen um direkt eine Sprachsteuerung oder Textsteuerung durchzuführen Screenshot 7.1 Longclick

Konfiguration

a.) IP-Symcon:

Hier das Script. Entsprechend die beiden Variablen im Script ersetzen bzgl. AndroidSend und AndroidReceive und das Array aufbauen mit Euren Konfigurationen.

<?

//Script Datum: 09.07.2015 Version 1.1

//Ersetze 44702 mit deiner AndroidReceive ID
$input = GetValueString(44702 /*[Scripte\Sprachsteuerung\AndroidReceive]*/  );
//Ersetze 40387 mit deiner AndroidSend ID
$outputid = 40387 /*[Scripte\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

//Ersetze hier das Array mit allen möglichen Variablen oder Geräteinstanzen etc... die Du hast
global $tg_info_devices;
$tg_info_devices = array(
"Büro1" => array("Typ" => "Licht", "Variable" => 54973, "Aussprache" => "Im Büro ist das Licht" ),
"Büro2" => array("Typ" => "Rollladen", "Variable" => 41402, "Aussprache" => "Im Büro ist der Rollladen" ),
"Büro3" => array("Typ" => "Computer", "Variable" => 29580, "Aussprache" => "Im Büro ist der Computer" ),
"Büro4" => array("Typ" => "Temperatur", "Variable" => 26262, "Aussprache" => "Im Büro beträgt die Temperatur" ),
"Büro5" => array("Typ" => "Solltemperatur", "Variable" => 20614, "Aussprache" => "Im Büro [wurde|beträgt] die Solltemperatur" ),
"Küche1" => array("Typ" => "Licht", "Variable" => 51429, "Art" => "Schrank", "Aussprache" => "In der Küche ist das Licht am Schrank" ),
"Küche2" => array("Typ" => "Licht", "Variable" => 55650, "Art" => "Decke", "Aussprache" => "In der Küche ist das Licht an der Decke" ),
"Küche3" => array("Typ" => "Rollladen", "Variable" => 49153, "Art" => "Fenster", "Richtung" => "Norden", "Aussprache" => "In der Küche ist der Rollladen des Fensters im Norden" ),
"Küche4" => array("Typ" => "Rollladen", "Variable" => 11830, "Art" => "Fenster", "Richtung" => "Westen", "Aussprache" => "In der Küche ist der Rollladen des Fensters im Westen" ),
"Küche5" => array("Typ" => "Rollladen", "Variable" => 49115, "Art" => "Tür", "Aussprache" => "In der Küche ist der Rollladen der Tür" ),
"Küche6" => array("Typ" => "Temperatur", "Variable" => 36304, "Aussprache" => "In der Küche beträgt die Temperatur" ),
"Küche7" => array("Typ" => "Luftfeuchtigkeit", "Variable" => 29164, "Aussprache" => "In der Küche beträgt die Luftfeuchtigkeit" ),
"Küche8" => array("Typ" => "Batterie", "Variable" => 17708, "Aussprache" => "In der Küche ist die Batterie des Sensors" ),
"Schlafzimmer1" => array("Typ" => "Licht", "Variable" => 42028, "Aussprache" => "Im Schlafzimmer ist das Licht" ),
"Schlafzimmer2" => array("Typ" => "Temperatur", "Variable" => 36426, "Aussprache" => "Im Schlafzimmer beträgt die Temperatur" ),
"Schlafzimmer3" => array("Typ" => "Luftfeuchtigkeit", "Variable" => 39357, "Aussprache" => "Im Schlafzimmer beträgt die Luftfeuchtigkeit" ),
"Schlafzimmer4" => array("Typ" => "Rollladen", "Variable" => 56308, "Aussprache" => "Im Schlafzimmer ist der Rollladen" ),
"Schlafzimmer5" => array("Typ" => "Solltemperatur", "Variable" => 28215, "Aussprache" => "Im Schlafzimmer [wurde|beträgt] die Solltemperatur" ),
"aussen1" => array("Typ" => "Windaktuell", "Variable" => 56046, "Aussprache" => "Draußen gibt es einen Wind von" ),
"aussen2" => array("Typ" => "Windböen", "Variable" => 40250, "Aussprache" => "Draußen existieren Windböen mit" ),
"aussen3" => array("Typ" => "Temperatur", "Variable" => 32134, "Aussprache" => "Draußen hat die Temperatur" ),
"aussen4" => array("Typ" => "Luftfeuchtigkeit", "Variable" => 40108, "Aussprache" => "Draußen hat es eine Luftfeuchtigkeit von" ),
"aussen5" => array("Typ" => "Regen", "Variable" => 59347, "Aussprache" => "Draußen regnet es" ),
"aussen6" => array("Typ" => "Helligkeit", "Variable" => 40288, "Aussprache" => "Draußen beträgt die Helligkeit" ),
"Wohnzimmer1" => array("Typ" => "Rollladen", "Variable" => 41403, "Art" => "Tür", "Aussprache" => "Im Wohnzimmer ist das Raffstore der Tür" ),
"Wohnzimmer2" => array("Typ" => "Rollladen", "Variable" => 41404, "Art" => "Fenster", "Aussprache" => "Im Wohnzimmer ist das Raffstore des Fensters" ),
"Wohnzimmer3" => array("Typ" => "Temperatur", "Variable" => 15013, "Aussprache" => "Im Wohnzimmer beträgt die Temperatur" ),
"Wohnzimmer4" => array("Typ" => "Luftfeuchtigkeit", "Variable" => 43371, "Aussprache" => "Im Wohnzimmer beträgt die Luftfeuchtigkeit" ),
"Wohnzimmer5" => array("Typ" => "Fernseher", "Variable" => 24532, "Aussprache" => "Im Wohnzimmer ist der Fernseher" ),
"Wohnzimmer6" => array("Typ" => "AVReceiver", "Variable" => 38396, "Aussprache" => "Im Wohnzimmer ist der AVReceiver" ),
"Wohnzimmer7" => array("Typ" => "Licht", "Variable" => 57627, "Art" => "Steh", "Aussprache" => "Im Wohnzimmer ist die Stehlampe" ),
"Wohnzimmer8" => array("Typ" => "Kino", "Variable" => 30063, "Aussprache" => "Im Wohnzimmer ist der Kinomodus" ),
"Vorzimmer1" => array("Typ" => "Licht", "Variable" => 42949, "Art" => "Wand", "Aussprache" => "Im Vorzimmer ist das Licht an der Wand" ),
"Vorzimmer2" => array("Typ" => "Licht", "Variable" => 56793, "Art" => "Decke", "Aussprache" => "Im Vorzimmer ist das Licht an der Decke" ),
"Vorzimmer3" => array("Typ" => "Temperatur", "Variable" => 30298, "Aussprache" => "Im Vorzimmer beträgt die Temperatur" ),
"Bad1" => array("Typ" => "Temperatur", "Variable" => 42086, "Aussprache" => "Im Bad beträgt die Temperatur" ),
"Bad2" => array("Typ" => "Solltemperatur", "Variable" => 48110, "Aussprache" => "Im Büro [wurde|beträgt] die Solltemperatur" ),
"Bad3" => array("Typ" => "Luftfeuchtigkeit", "Variable" => 10945, "Aussprache" => "Im Bad beträgt die Luftfeuchtigkeit" ),
"Keller1" => array("Typ" => "Temperatur", "Variable" => 42086, "Aussprache" => "Im Keller beträgt die Temperatur" ),
"Keller2" => array("Typ" => "Luftfeuchtigkeit", "Variable" => 10945, "Aussprache" => "Im Keller beträgt die Luftfeuchtigkeit" ),
"Wetter1" => array("Typ" => "Wetter", "Variable" => 55167, "Art" => "Heute", "Aussprache" => "" ),
"Wetter2" => array("Typ" => "Wetter", "Variable" => 31534, "Art" => "Morgen", "Aussprache" => "" ),
"Wetter3" => array("Typ" => "Wetter", "Variable" => 17550, "Art" => "Übermorgen", "Aussprache" => "" ),
"Wetter4" => array("Typ" => "Wetter", "Variable" => 58310, "Art" => "Trend", "Aussprache" => "" ),
"Uhrzeit" => array("Typ" => "Uhrzeit", "Variable" => 00000, "Aussprache" => "Die aktuelle Uhrzeit ist" ),
"Anwesenheit" => array("Typ" => "Anwesenheit", "Variable" => 42533, "Aussprache" => "Der Anwesenheitsstatus ist" ),
);

$zahl = 0;
$detail = "";
$raum = "";
$aktion = "";
$art = "";
$richtung = "";
$typ = "";
$tsay = "";
$techstatus = true;

//für mehrere Sprachbefehle über das UND einen Split machen von $input in Arrays und über das Array auswerten
$inputarray = explode( "und", $input, 9 );
foreach ($inputarray as $input)
{
  print_r("--------------Input - Variable -----------
");
  print_r("$input
");
  print_r("------------------------------------------

");
  // a.) Suche nach Zahl, Aktion, Raum im Kommando (ansonsten wenn elementares fehlt aussteigen)
	switch (true) {
		 // Suche nach erster Zahl im Kommando
		 case (preg_match("([1-9]+)", $input, $matches)) :
	        $zahl = $matches[0];
	        break;
	}

	switch (true) {
	    case (preg_match("/computer|pc/i", $input) ? true : false ) :
			  $typ = "Computer";
			  break;
	    case (preg_match("/fernseher/i", $input) ? true : false ) :
			  $typ = "Fernseher";
			  break;
	    case (preg_match("/av receiver/i", $input) ? true : false ) :
			  $typ = "AVReceiver";
			  break;
	    case (preg_match("/sat/i", $input) ? true : false ) :
			  $typ = "SATReceiver";
			  break;
       case (preg_match("/kino/i", $input) ? true : false ) :
			  $typ = "Kino";
			  break;
		 case (preg_match("/rol|store/i", $input) ? true : false) :
			  $typ = "Rollladen";
			  break;
	    case (preg_match("/licht|beleuchtung|lampe|led/i", $input) ? true : false) :
			  $typ = "Licht";
			  break;
	    case (preg_match("/solltemperatur/i", $input) ? true : false ) :
			  $typ = "Solltemperatur";
			  break;
	    case (preg_match("/grad|temperatur/i", $input) ? true : false ) :
			  $typ = "Temperatur";
			  break;
		 case (preg_match("/luft|feucht/i", $input) ? true : false ) :
			  $typ = "Luftfeuchtigkeit";
			  break;
	    case (preg_match("/boeen|spitze|böen/i", $input) ? true : false ) :
			  $typ = "Windböen";
			  break;
		 case (preg_match("/kmh|wind|geschwindigkeit/i", $input) ? true : false ) :
			  $typ = "Windaktuell";
			  break;
	    case (preg_match("/regen|niederschlag/i", $input) ? true : false ) :
			  $typ = "Regen";
			  break;
		 case (preg_match("/helligkeit/i", $input) ? true : false ) :
			  $typ = "Helligkeit";
			  break;
		 case (preg_match("/wetter/i", $input) ? true : false ) :
			  $typ = "Wetter";
			  break;
		 case (preg_match("/batterie/i", $input) ? true : false ) :
			  $typ = "Batterie";
			  break;
		 case (preg_match("/spät|uhrzeit/i", $input) ? true : false ) :
			  $typ = "Uhrzeit";
			  break;
		 case (preg_match("/anwesen|abwesen/i", $input) ? true : false ) :
			  $typ = "Anwesenheit";
			  break;
	}

	switch (true) {
		 case (preg_match("/wer|wie|was|warum|weshalb|wann|welche|wieviel|sage|antworte|lese|ist/i", $input) ? true : false ) :
			  $aktion = "frage";
			  break;
	    case (preg_match("/schliesse|schließe|zu|runter|unten/i", $input) ? true : false) :
	        $aktion = "runter";
	        break;
	    case (preg_match("/oeffne|öffne|auf|hoch|oben/i", $input) ? true : false ) :
			  $aktion = "rauf";
			  break;
	    case (preg_match("/an|ein|on/i", $input) ? true : false ) :
			  $aktion = "ein";
			  break;
	    case (preg_match("/aus|off|ab/i", $input) ? true : false ) :
			  $aktion = "aus";
			  break;
	    case (preg_match("/schalte|schalke|setze|sätze|chapter|fette/i", $input) ? true : false ) :
			  $aktion = "schalte";
			  break;
		 default :
			  $aktion = "frage";
			  break;
	}

	switch (true) {
		 case (preg_match("/sek/i", $input) ? true : false ) :
			  $detail = "Sekunden";
			  break;
		 case (preg_match("/prozent/i", $input) ? true : false ) :
			  $detail = "Prozent";
			  break;
		 case (preg_match("/blau/i", $input) ? true : false ) :
			  $detail = "Blau";
			  break;
		 case (preg_match("/rot/i", $input) ? true : false ) :
			  $detail = "Rot";
			  break;
		 case (preg_match("/grün/i", $input) ? true : false ) :
			  $detail = "Grün";
			  break;
		 case (preg_match("/gelb/i", $input) ? true : false ) :
			  $detail = "Gelb";
			  break;
	}

	switch (true) {
		 case (preg_match("/tuer/i", $input) ? true : false ) :
			  $art = "Tür";
			  break;
	    case (preg_match("/fenster/i", $input) ? true : false ) :
			  $art = "Fenster";
			  break;
		 case (preg_match("/decke/i", $input) ? true : false ) :
			  $art = "Decke";
			  break;
	    case (preg_match("/wand/i", $input) ? true : false ) :
	        $art = "Wand";
	        break;
		 case (preg_match("/steh/i", $input) ? true : false );
			  $art = "Steh";
			  break;
		 case (preg_match("/tisch/i", $input) ? true : false );
			  $art = "Tisch";
			  break;
		 case (preg_match("/platte/i", $input) ? true : false );
			  $art = "Platte";
			  break;
		 case (preg_match("/heute/i", $input) ? true : false ) :
			  $art = "Heute";
			  break;
		 case (preg_match("/überübermorgen|langzeit|trend|forecast/i", $input) ? true : false ) :
			  $art = "Trend";
			  break;
		 case (preg_match("/übermorgen/i", $input) ? true : false ) :
			  $art = "Übermorgen";
			  break;
       case (preg_match("/schrank/i", $input) ? true : false ) :
			  $art = "Schrank";
			  break;
		 case (preg_match("/morgen/i", $input) ? true : false ) :
			  $art = "Morgen";
			  break;
	}

	switch (true) {
		 case (preg_match("/nord/i", $input) ? true : false ) :
			  $richtung = "Norden";
			  break;
	    case (preg_match("/sued/i", $input) ? true : false ) :
			  $richtung = "Süden";
			  break;
	    case (preg_match("/west/i", $input) ? true : false ) :
			  $richtung = "Westen";
			  break;
	    case (preg_match("/ost/i", $input) ? true : false ) :
			  $richtung = "Osten";
			  break;
	}

	switch (true) {
	    case (preg_match("/buero|büro/i", $input) ? true : false ) :
			  $raum = "Büro";
			  break;
	    case (preg_match("/wohn/i", $input) ? true : false ) :
			  $raum = "Wohnzimmer";
			  break;
	    case (preg_match("/schlaf/i", $input)) :
	        $raum = "Schlafzimmer";
			  break;
	    case (preg_match("/kueche|küche/i", $input) ? true : false ) :
			  $raum = "Küche";
			  break;
	    case (preg_match("/bad/i", $input) ? true : false ) :
			  $raum = "Bad";
			  break;
	    case (preg_match("/ess/i", $input) ? true : false ) :
			  $raum = "Essplatz";
			  break;
	    case (preg_match("/klo|wc/i", $input) ? true : false ) :
			  $raum = "WC";
			  break;
	    case (preg_match("/gaeste|gäste/i", $input) ? true : false ) :
			  $raum = "Gästezimmer";
			  break;
	    case (preg_match("/kinder/i", $input) ? true : false ) :
			  $raum = "Kinderzimmer";
			  break;
	    case (preg_match("/party|feier/i", $input) ? true : false ) :
			  $raum = "Partyraum";
			  break;
	    case (preg_match("/garage/i", $input) ? true : false ) :
			  $raum = "Garage";
			  break;
	    case (preg_match("/keller/i", $input) ? true : false ) :
			  $raum = "Keller";
			  break;
		 case (preg_match("/alle/i", $input) ? true : false ) :
			  $raum = "alle";
			  break;
	    case (preg_match("/aussen|außen/i", $input) ? true : false ) :
			  $raum = "Aussen";
			  break;
		case (preg_match("/vorzimmer|vorraum/i", $input) ? true : false ) :
			  $raum = "Vorzimmer";
			  break;
	}
	
	if (preg_match("/nix|nicht/i", $input) ? true : false ) {
        SetValueString($outputid, "Ok viel Spass");
		  return true;
	}
	
	if ($zahl == 0) {
	   $zahl = 1 ;
	}

	// b.) Auswerten ob $aktion gesetzt
	if ($aktion == "" ) {
	   $tsay = "Du hast vergessen eine Aktion mit zu geben!";
	}

	// c.) Auswerten ob $typ gesetzt
	if ($typ == "") {
	   $tsay = "Du hast vergessen einen Typ mit zu geben!";
	}

	// d.) Auswerten ob $raum gesetzt
	if ($raum == "") {
		//wenn raum leer ist "alle" annehmen
		$raum = "alle";
	}

	print_r("-----------Input - ausgewertet -----------
");
	print_r("Typ: $typ 
");
	print_r("Aktion: $aktion 
");
	print_r("Raum: $raum 
");
	print_r("Detail: $detail 
");
	print_r("Richtung: $richtung 
");
	print_r("Art: $art 
");
	print_r("Zahl: $zahl 
");
	print_r("------------------------------------------
");

	// e.) Steuern der Aktionen
	// lese zuerst alle Typen die übereinstimmen aus dem Array
	if ($typ <> "" && $aktion <> "") {
	  foreach( $tg_info_devices as $rauma => $value ) {
		 foreach( $value as $wert => $inhalt ) {
			  if ($wert == "Typ" && preg_match("/$typ/i", $inhalt) == true ) {
				  //wir brauchen auch noch die anderen Werte
				  $leseweiter = TRUE;
			  }
			  if ($wert == "Typ" && preg_match("/$typ/i", $inhalt) == false) {
				  $leseweiter = FALSE;
			  }
			  if ($leseweiter == TRUE && $wert == "Variable" ) {
				  $variablea = $inhalt;
			  }
			  if ($leseweiter == TRUE && $wert == "Art" ) {
				  $arta = $inhalt;
			  }
			  if ($leseweiter == TRUE && $wert == "Richtung" ) {
				  $richtunga = $inhalt;
			  }
			  if ($leseweiter == TRUE && $wert == "Aussprache" ) {
				  $aussprache = $inhalt;

				  //hier jetzt die Aktion durchführen wenn auch Raum übereinstimmt!
				  $leseweiter = FALSE;
				  if ( preg_match("/$raum/i", $rauma) == true || $raum == "alle" ) {
					  //zuerst noch Art abfragen wenn man zB: 2 Fenster, Lichter etc. in einem Raum hat
					  //ob Match gegeben ist
	              print_r("Variable: $variablea 
");
					  $continue1 = 0;
					  if ($art <> "") {
						  if ($art == $arta) {
							  $continue1 = 1;
						  }
					  }
					  else {
						  $continue1 = 1;
					  }
					  //hier noch Richtung abfragen wenn man zB: Westen,Osten,Norden,Süden aussteuert
					  $continue2 = 0;
					  if ($richtung <> "") {
						  if ($richtung == $richtunga) {
							  $continue2 = 1;
						  }
					  }
					  else {
						  $continue2 = 1;
					  }
					  print_r("Continue1: $continue1 
");
	  				  print_r("Continue2: $continue2 
");
					  if ($continue1 == 1 && $continue2 == 1) {
						  //Ab hier jetzt die tatsächlichen Aktionen je Typ
					     switch ($typ) {
						  case "Rollladen" :
							  if ($aktion == "runter") {
								  if (preg_match("/Sekunden|Sek/i", $detail) == true) {
									  $zahlms = $zahl * 1000;
									  $tsay .= " $aussprache $zahl Sekunden nach unten bewegt worden!";  //hier vorher, mehr als 30sekunden zu Abbruch
									  $techstatus = SC_MoveDown($variablea,$zahlms);
								  } else {
	                          $techstatus = SC_MoveDown($variablea,0);
	                          $tsay .= " $aussprache jetzt unten";
								  }
							  }
							  if ($aktion == "rauf") {
								  if (preg_match("/Sekunden|Sek/i", $detail) == true) {
									  $zahlms = $zahl * 1000;
									  $tsay .= " $aussprache $zahl Sekunden nach oben bewegt worden!";
									  $techstatus = SC_MoveUp($variablea,$zahlms);
	                       } else {
	                          $techstatus = SC_MoveUp($variablea,0);
	                          $tsay .= " $aussprache jetzt oben";
								  }
							  }
							  break;

	                 case (preg_match("/Licht|Fernseher|Computer|AVReceiver|SATReceiver|Kino|Anwesenheit/i", $typ) ? true : false ) :
							  if ($aktion == "schalte") {   //egal ob aus oder ein, einfach Befehl
								 if (GetValueBoolean($variablea) == false) {
								    $techstatus = SetValueUniversal($variablea,true);
								    $tsay .= " $aussprache jetzt an";
								    print_r("Schalter: schalte an");
								 } else {
									 $techstatus = SetValueUniversal($variablea,false);
									 $tsay .= " $aussprache jetzt aus";
									 print_r("Schalter: schalte aus");
								 }
							  }
							  if ($aktion == "ein") {      //einschalten
	                      if (GetValueBoolean($variablea) == false) {
								    $techstatus = SetValueUniversal($variablea,true);
								    $tsay .= " $aussprache jetzt an";
								    print_r("Schalter: schalte an");
								 } else {
									 $tsay .= " $aussprache bereits an";
									 print_r("Schalter: bereis an");
								 }
							  }
							  if ($aktion == "aus") {      //ausschalten
	                      if (GetValueBoolean($variablea) == false) {
	                        $tsay .= " $aussprache bereits aus";
	                        print_r("Schalter: bereits aus");
								 } else {
	                        $techstatus = SetValueUniversal($variablea,false);
	                        $tsay .= " $aussprache jetzt aus";
	                        print_r("Schalter: schalte aus");
								 }
							  }
							  if ($aktion == "frage") {   //Status ausgeben
	                      if (GetValueBoolean($variablea) == false) {
									$tsay .= " $aussprache aus";
									print_r("Frage: aus");
								 } else {
									$tsay .= " $aussprache an";
									print_r("Frage: ein");
								 }
							  }
							  break;

						  case "Temperatur" :
							  $temperatur = GetValueFloat($variablea);
							  $aussprache = str_replace("[wurde|beträgt]","beträgt",$aussprache);
							  $tsay .= " $aussprache $temperatur Grad";
							  break;

						  case (preg_match("/Wind/i", $typ) ? true : false ) :
							  $wind = GetValueFloat($variablea);
							  $tsay .= " $aussprache $wind Kilometer pro Stunde";
							  break;

						  case "Luftfeuchtigkeit" :
							  $luftfeuchtigkeit = GetValueInteger($variablea);
							  $tsay .= " $aussprache $luftfeuchtigkeit Prozent";
							  break;

						  case "Helligkeit" :
							  $helligkeit = GetValueInteger($variablea);
							  $tsay .= " $aussprache $helligkeit Lux";
							  break;

						  case "Regen" :
							  $regen = GetValueFloat($variablea);
							  $tsay .= " $aussprache $regen Millimeter";
							  break;

						  case "Batterie" :
							  $batterie = GetValueFormatted($variablea);
							  $tsay .= " $aussprache $batterie ";
							  break;

						  case "Wetter" :
							  $wetter = GetValue($variablea);
							  $wetter = strip_tags($wetter);
							  $wetter = mb_convert_encoding($wetter, "ISO-8859-2", "UTF-8");
							  $tsay .= " $aussprache $wetter";
							  break;

							case "Uhrzeit" :
							  $uhrzeit = date("H")." Uhr ".(int)date("i");
							  $tsay .= " $aussprache $uhrzeit";
							  break;
					     }
					  }
				  }
	        }
	    }
	  }
	}
}

if ($tsay == "") {
	$tsay = "Der Befehl konnte von mir nicht ausgewertet werden";
}
if ($techstatus == false) {
	$tsay = "Wegen eines technischen Problems konnte der Befehl nicht ausgeführt werden";
}

//Setzen androidSend
SetValueString($outputid, "$tsay");

$SkriptLaufzeit = microtime(true) - $SkriptStart;
print_r("
------------------Output------------------
");
print_r("$tsay
");
print_r("Script Laufzeit $SkriptLaufzeit Sekunden
");
print_r("------------------------------------------
");

//f.) Offene Themen
//f1.) Prozent Angaben für öffnen /schließen usw.. aus IPSShadowing Logik?
//f2.) Wie bekommt IPSShadowing den veränderten Status mit bei Rollladen schließen über Shutter Modul???
//f3.) Licht RGB und dimmen und über schalter wie implementieren in dieser Logik?

function SetValueUniversal($VariableID, $Value) {
    // Prüfe ob Variable direkt beschreibbar ist (nicht ReadOnly)
    if(IPS_GetObject($VariableID)['ObjectIsReadOnly'] === false) {
       // Variable kann direkt gesetzt werden
       // Den Typ 0=Boolean, 1=Integer, 2=Float, 3=String
       return SetValue($VariableID, $Value);
    } else {
       // Variable ist eine Status Variable. Suche übergeordnete Instanz zum Beschreiben
       $ParentID = IPS_GetObject($VariableID)['ParentID'];
       // Den Namen des Ident der Variablen z.B. STATE
       $ObjectIdent = IPS_GetObject($VariableID)['ObjectIdent'];
       // Den Typ 0=Boolean, 1=Integer, 2=Float, 3=String
       $VariableType = IPS_GetVariable($VariableID)['VariableValue']['ValueType'];
       // Den Modul Type (siehe http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/modulverwaltung/ips-getmoduleList/)
       $ModuleType = GetModuleType($ParentID);
        switch($ModuleType) {
           case "HomeMatic Device":
                  if($VariableType == 0) return HM_WriteValueBoolean($ParentID, $ObjectIdent, $Value);
                  if($VariableType == 1) return HM_WriteValueInteger($ParentID, $ObjectIdent, $Value);
                  if($VariableType == 2) return HM_WriteValueFloat($ParentID, $ObjectIdent, $Value);
                  if($VariableType == 3) return HM_WriteValueString($ParentID, $ObjectIdent, $Value);
                  break;
            case "FS20":
                  // ....
                  // ...
                  break;
				case "xComfort Switch":
                  if($VariableType == 0) return MXC_SwitchMode($ParentID, $Value);
						break;
				case "LCN Unit":
                  if($VariableType == 0) return LCN_SwitchRelay($ParentID, $Value);
                  break;
            case "Alle meine genutzten Hardwaretypen":
                  // ...
                  // ..
            default:
               // Modul nicht gefunden oder unterstüzt
                  return false;
        }
    }
}

function GetModuleType($ObjectID) {
    foreach(IPS_GetModuleList() as $guid) {
      $module = IPS_GetModule($guid)['ModuleName'];
      if(in_array($ObjectID, IPS_GetInstanceListByModuleID($guid))) {
         return $module;
        }
    }
    return "";
}

?>

Der IP Symcon Fernzugriff muss aktiviert werden. Hilfreiche Anleitung:
https://www.symcon.de/service/dokumentation/komponenten/tray/fernzugriff/

b.) Android:
Als erstes in der App unter Einstellungen die notwendigen Konfigurationen treffen. [b]ACHTUNG: SSL/HTTPS funktioniert nur bei der App „Haussteuerung“/B]

Fehlerhandling

  • In der Android App den Debugger Modus aktivieren
  • Error 1101 und Error 1103 deuten auf eine falsche Konfiguration hin in den Android Einstellungen. zB: folgendes versuchen
    Prüfen im Android Browser ob http://:/api/ bzw. mit https://:/api/ folgendes Ergebnis liefert
    {
    „IP-Symcon“: „3.20“,
    „API“: „0.2“,
    „JSON-RPC“: „2.0“
    }
  • wer Linux zur Verfügung hat folgendes probieren ob er über json entsprechend den Wert der IP Symcon Variable erhält
    curl -v -X POST -H „Content-Type: application/json“ -d ‚{„jsonrpc“:„2.0“,„method“:„GetValueString“,„params“:[40387],„id“:1}‘ -k -u max.muster@gmx.at:fernzugriffpasswort http://10.0.0.99:82/api/ --trace-ascii /dev/stdout
  • Fehlermeldung „end of input at character 0“ im Debugger Modus deutet darauf hin, dass das Fernzugriffpasswort falsch eingegeben wurde

Zusätzliche Informationen

  • derzeit ist im IP Symcon Script der Default „ALLE“ bzgl. Raum, wenn der Raum weggelassen wird bezieht es sich auf Alle Räume. Das führt aber auch dazu wenn der Raum nicht korrekt verstanden wird von der Google Spracherkennung, dass alle Räume betroffen sind. Kann deaktiviert werden indem folgendes Coding entfernt wird im Script Android Voice
// d.) Auswerten ob $raum gesetzt
if ($raum == "") {
	//wenn raum leer ist "alle" annehmen
	$raum = "alle";
}
  • die Android App IPSymconVoice wurde mit „App Inventor 2“ entwickelt, somit habe ich keinen Einfluss auf die Berechtigungen die notwendig sind!
  • die Android App Haussteuerung wurde mit Android Studio entwickelt und ich habe vollen Einfluss auf die Berechtigungen
  • beim Android Gerät im Android Menü (nicht von der App) unter „Sprache & Eingabe“ darauf achten, dass die Sprache „Deutsch“ eingestellt ist! (zB: bei Verwendung von der Google Spracheingabe und dort auf das Config Symcol klicken), die Sprache kann dort auch Offline heruntergeladen werden und die Sprachgeschwindigkeit dort eingestellt werden
  • die Auswertung der Sätze erfolgt auf Wörter Basis; somit bin ich unabhängig vom Satzbau; es müssen nur die Schlüsselwörter vorkommen wie zB: „Schalte Licht Küche ein“ egal wie dann der Satzbau rund herum ist und die Reihenfolge der Wörter spielt auch keine Rolle
  • wenn man einmal den „Lese NFC-Tag“ Button gedrückt hat kann man beliebig oft hintereinander von verschiedenen NFC-Tags lesen (IPSymconVoice App), bei der App Haussteuerung entfällt der Button weil quasi immer der NFC Lese Modus aktiv ist (man kann in den App Einstellungen allerdings verhindern dass die Aktion in IP-Symcon ausgeführt wird wenn man das nicht möchte)
  • ein leerer NFC-Tag muss initial mit einem anderen Tool erstmalig mit einem Dummy Wert beschrieben werden (zB: mit NFC-Tools von wakdev; siehe Google Play Store) <<<---- gilt nur für die App IPSymconVoice
  • bei der Wetter-Abfrage zB: „Wie wird das Wetter Morgen“ oder „Sage mir den weiteren Wetter Trend“ wird IPSWeatherForcastAT von der IPSLibrary verwendet

Technik

  • beide Android Apps greifen folgendermaßen auf die IP-Symcon JSON API zu (1x GET für die generelle Verbindung; 1x POST um den Befehl in die IP-Symcon Variable androidReceive zu schreiben; 1x POST um die Antwort vom Script AndroidVoice aus der Variable androidSend auszulesen)
  • zusätzlich mache ich das Schalten von Fernseher, AV-Receiver, Licht, usw… immer per Toggle Script (siehe nächstes Posting)

Beispiel Satzstellungen

  • Ist das Licht im Büro eingeschaltet
  • Schalte das Licht im Büro ein
  • Schalte Licht Büro
  • Knippse das Licht im Büro an

LG
Thiemo

Hier 2 Beispiele von Toggle Scripten die ich verwende für zB: Licht schalten, Fernseher, Computer, AV Receiver usw…

Toggle Script in Verbindung mit Homematic 6-fach Wandtaster

Neue Variable PRESS_SHORT_TOGGLE mit Script und auslösendem Ereignis bei Variablenaktualisierung
Wenn der Homematic Taster gedrückt wird verändert sich PRESS_SHORT und dort wartet auch ein Script mit auslösendem Ereignis welches den Status von PRESS_SHORT_TOGGLE verändert

Inhalt von Script „Toggle_Kueche_6fach_Key1“

<?

SetValue(53974 /*[WS Kueche 6fach Key1\PRESS_SHORT_TOGGLE]*/, !GetValue(53974 /*[WS Kueche 6fach Key1\PRESS_SHORT_TOGGLE]*/));

?>

Inhalt von Script „LED_Kueche_schalten“ (Homematic Schalter)

<?

//LED-Stripes Küche an oder aus
$currentstat = GetValueBoolean( 51429 /*[S Küche LEDStripes\STATE]*/ );
if ($currentstat == TRUE) {
  HM_WriteValueBoolean(15332 /*[S Küche LEDStripes]*/, "STATE", false); //Gerät ausschalten
}
else {
  HM_WriteValueBoolean(15332 /*[S Küche LEDStripes]*/, "STATE", true); //Gerät einschalten
}

?>

Anderes Beispiel mit Möller Eaton xcomfort:

<?
// Trigger vom Script: Press Short Toggle (AN/AUS)
$id_schaltaktor_pc = 16670 /*[S Buero PC]*/;                //Objekt-ID des Schaltaktors (xcomfort) Instanz 
$id_schaltaktor_status_pc = 17190 /*[S Buero PC\Status]*/;  //Boolean Status Schaltaktor (xcomfort)
$status_pc = GetValueBoolean($id_schaltaktor_status_pc);
if ($status_pc == FALSE) {     //wenn aus, dann Schalter PC ein
   MXC_SwitchMode($id_schaltaktor_pc, true);          //PC einschalten (xcomfort Befehl)
} else {
   MXC_SwitchMode($id_schaltaktor_pc, false);          //PC ausschalten (xcomfort Befehl)
}
?>

Toggle Script virtueller Schalter zB: für NFC Tag

Im Script dann Philips HUE

<?
/*

    PhilIPS hue LED Leuchte Schalten
    Ersteller: peterchrisben
    Datum: 08.02.2013
    Version: 0.1
	 Selber verändert (Toggle Funktion) 02.11.2014

*/
$bridge_ip = '10.0.0.98';
$lamp_no= 2; // Schalfzimmer
$key='ffffffffffffffffffffffffffffffffff';

				$json_url_status = 'http://'.$bridge_ip.'/api/'.$key.'/lights/'.$lamp_no.'/';
				$json_url = 'http://'.$bridge_ip.'/api/'.$key.'/lights/'.$lamp_no.'/state';

				//Status abfragen
				$json_url_fetch  = file_get_contents($json_url_status);
				$fetch_array = json_decode($json_url_fetch, true);
				if($fetch_array['state']['on'] == "1") {
               $json_string = '{"bri":128, "on":false}'; // "bri" = Helligkeit (0-254) "on" = ein/aus (true/false)
				} else {
               $json_string = '{"bri":128, "on":true}'; // "bri" = Helligkeit (0-254) "on" = ein/aus (true/false)
				}

				//Schalten
            $ch = curl_init( $json_url );
            // Configuring curl options
            $options = array(
                            CURLOPT_RETURNTRANSFER => true,
                            CURLOPT_CUSTOMREQUEST => 'PUT', // -X
                            CURLOPT_HTTPHEADER => array('Content-type: application/json') ,
                            CURLOPT_POSTFIELDS => $json_string
                            );


            // Setting curl options
            curl_setopt_array( $ch, $options );

            // Getting results
            $result =  curl_exec($ch);


        print_r ("Result: $result 
");



?>


Toogle Boolean Variablen im Webfront

Hier noch eine Info wie ich die Toggle Boolean Variablen im Webfront darstelle damit ich immer egal ob über Webfront, zB: Homematic Schalter oder Sprachsteuerung immer den richtigen Status habe über EIN/AUS

Ein Script erstellen das Boolean_Aktion lautet mit folgendem Inhalt und bei mir abgespeichert wird in der Kategorie Scripte


<?

if($IPS_SENDER == "WebFront")
{
      SetValue($IPS_VARIABLE, $IPS_VALUE);
}

?>

Bei der Toogle Boolean Variable unter eigene Aktion dann entsprechend dieses Script auswählen:
Scripte\Boolean_Aktion

Im Webfront dann einen Link auf die Toogle Boolean Variable definieren und nicht mehr auf den Schalter direkt.

Blöderweise um 90 Grad verkehrt aufgenommen :wink:

Sprachsteuerung
[video=youtube_share;ahLyc6FkxAg]- YouTube

Statusabfragen per Sprache

NFC-Tag Read

NFC-Tag Write

Hallo Thiemo,

das ist GENIAL!!!

Einzig die Lichtsteuerung muss noch aufgebohrt werden, ich habe z.B. mehrere Leuchten in einem Raum. Ich versuche mich da grade einzulesen, aber ich bin noch nicht so ganz durchgestiegen. Vielleicht hast Du da ja einen Tipp…

Ja das mit der Lichtsteuerung ist in der Tat noch ein Problem.
Ich habe es bisher versucht mit „ART“ und „RICHTUNG“ abzudecken im Script um näher zu präzisieren wenn mehrere Lichter in einem Raum sind und man nicht immer alle schalten will.

Also so zB: der Auszug vom Script oben:
Art gibt es dann Tür; Fenster; Decke; Wand und Richtung Norden; Osten; Süden; Westen

Wenn es dann so eingetragen wird als Beispiel:

$tg_info_devices = array(
"Büro1" => array("Typ" => "Licht", "Variable" => 12345, "Art" => "Decke", "Richtung" => "Norden", "Aussprache" => "Im Büro ist das Licht an der Decke im Norden" ),
"Büro2" => array("Typ" => "Licht", "Variable" => 12346, "Art" => "Decke", "Richtung" => "Osten", "Aussprache" => "Im Büro ist das Licht an der Decke im Osten" ),
"Büro3" => array("Typ" => "Licht", "Variable" => 12347, "Art" => "Wand", "Aussprache" => "Im Büro ist das Licht an der Wand" ),
"Büro4" => array("Typ" => "Licht", "Variable" => 12348, "Art" => "Tür", "Aussprache" => "Im Büro ist das Licht über der Tür" ),
);

Sollten dann folgende Befehle entsprechend steuern:
„Schalte alle Lichter ein“ => Büro1, Büro2, Büro3, Büro4, + Wohzimmer, Schlafzimmer usw…
„Schalte das Licht im Büro ein“ => Büro1, Büro2, Büro3, Büro4
„Schalte das Licht im Büro an der Decke“ => Büro1, Büro2
„Schalte das Licht im Büro an der Decke im Osten“ => Büro 2
„Schalte das Licht im Büro über der Tür“ => Büro 4
„Schalte das Licht im Büro an der Wand“ => Büro 3

Problematisch wird es definitiv wenn man sehr viele Spots hat die alle einzeln ansprechbar sein sollen!
Natürlich kann man die Art im PHP Script noch aufbohren zB: für Tisch um eine Tischlampe extra anzusprechen oder Arbeitsplatte um zB: das eingebaute Licht über der Arbeitsplatte unter Hängeregale anzusprechen oder dergleichen

Das Script im ersten Posting habe ich abgeändert um zusätzliche Arten einzugeben und bei der Frage war noch ein Bug drinnen und bei einer Abfrage.

Feedback ist immer gerne willkommen.

Ich habe zB: noch eine Kleinigkeit verändert um Spracherkennungsfehler zu kompensieren. Manchmal versteht die Google Sprachsuche „Schalke“ anstelle von „Schalte“. Liegt vielleicht auch an meinem Akzent (Mundart)


    case (preg_match("/schalte|schalke/i", $input) ? true : false ) :
		  $aktion = "schalte";
		  break;

Hallo Thiemo,

Ich muss sagen 1A++++. :smiley:

Android App installiert, Dein Script ein bisschen abgeändert damit es meine Homematic Lichter schalten kann und es klappt.

Ich habe meine Amazon „Echo“ Vorbestellung wieder storniert. Die braucht mit Deinem Tool kein Mensch mehr! :wink:

SSL klappt übrigens auch vorzüglich. Ich terminiere SSL an meinem Reverse Proxy und gehe dann mit HTTP weiter zu IPS.
Jetzt müssen wir nur noch die offenen Themen, wie Du bereits im Script anmerktest, elegant lösen und wir haben eine super neue Möglichkeit unser IPS zu nutzen.

Die langen Winterabende sind gerettet!

P.S. Ich würde Dich für den IP-Symcon Oscar nominieren!

Hallo Thiemo,

genau so soll’s sein!

Gut, dass wir hier keine Mundart sprechen… :smiley:

Uwe, ich bin bei Dir: IPS-Oscar für Thiemo!

Sollte jemand, wie ich, auf EIB/KNX gesetzt haben, wird er leider ein kleines Problem bekommen. IPS geht leider bei EIB etwas anders mit den Variablen um, als man es erwarten würde. Eine Variable, die eine EIB-Gruppenadresse darstellt, kann nicht beschrieben werden. Stattdessen muss der Schreibbefehl auf die Instanz erfolgen.

Zuerst wollte ich das Script erweitern, was mir aber zu komplex erschien; vor allem in Hinblick auf die weitere „Aufrüstung“ mit neuen Funktionen. Ich hätte bei der Device-Definition am Anfang zusätzlich die Instanz mitgeben und dann die Auswertung entsprechend anpassen müssen. Die Lösung war eine Hilfsvariable einzusetzen, die mit dem Toggelscript und einem Ereignis, wie von Thiemo beschrieben, ausgestattet ist und zusätzlich noch ein Ereignis zu der „echten“ Variable hinzufügen, was die Hilfsvariable schaltet, wenn die Aktion im WebFront ausgeführt wird. In der Spracherkennung wird die Hilfsvariable verwendet, die sendet im Script dann ein „EIB_Switch“ an die Instanz und schaltet damit die Lampe ein/aus. Wird im WebFront geschaltet, wird über das Ereignis die Hilfsvariable „gleichgezogen“.

Dies nur als kleiner Hinweis an meine EIB-Leidensgenossen. Die Frage an Paresy und Steiner wäre, ob dieses „abnormale“ Verhalten nicht programmtechnisch gelöst werden kann, damit wir EIBler nicht immer basteln müssen.

Das ist bei Homematic aber auch so. Statt SetValue musst Du Dir eine eigene Funktion basteln, die die übergeordnete Instanz ermittelt und dann dort den Befehl absetzt. Komplizierter wird es bei Unterschiedlichen Systemen. Wenn z.B. eine Lampe mit Homematic, die andere aber mit Siemens S7 geschaltet wird. Beide haben eine Boolean Variable (Licht an/aus), zum ändern muss man aber die übergeordnete Instanz bemühen und das mit komplett unterschiedlichen Befehlen. Mit dem Konzept der IPSLibrary sollte dies aber elegant lösbar sein.

Gesendet von meinem Nexus 4 mit Tapatalk

Danke Uwe,

wieder schlauer geworden. Hab noch immer keine Homematic Geräte, Dein ehemaliger Gateway dient nur der Zierde. Dann will ich nichts gesagt haben.

Noch 'ne Frage. Die Temperatur wird angesagt als „Zwanzig-Punkt-Neunzehn Grad“, im Objektbaum und im WF steht aber „20,2“, woher kommt das?

Hallo Thiemo,

ist Super, die Temperatur bekomme ich schon angesagt, aber ich bekomme es nicht hin das Licht zu schalten.

Ich habe FS20 und HM, aber egal welche Variabler ich angebe, entweder kommt Variable existiert nicht oder nur als lesen markiert.

Kannst Du mir da noch einen Tip geben?

Hallo Horst,

ich habe das mit einer Hilfsvariablen gemacht:

Die Scripte Schalten die übergeordneten Instanzen wenn die Hilfsvariable geschaltet wird. Die Ereignisse unter den eigentlichen Variablen schalten die Hilfsvariablen, damit Änderungen im WF auch auf die Hilfsvariablen durchgereicht werden.

Danke, habe ich mir schon fast gedacht.

Gesendet von meinem SM-T805 mit Tapatalk

Kann ich als IP auch eine lokale (192.168…) eingeben?

So richtig bekomme ich es nicht hin, es hagelt Fehler. Deshalb möchte ich erstmal alle Umwege als Ursache ausschließen.

Grüße
galleto

Hallo galleto,

klar kannst Du auch eine lokale IP nehmen. Die dient ja nur der Verbindung Handy <—> IPS-Server, Spracherkennung macht Herr Google. Das Handy schickt dann nur den erkannten Text als String an das Script.

Wenn Du mal auf der ersten Seite der App guckst, dort gibt es auch einen Button „Textsteuerung“. Wenn Du da den Text, den Du normalerweise sprichst, eingibst, funktioniert es auch.

Das Problem mit den Instanzvariablen lässt sich auch ohne Hilfsvariablen lösen.
Hier ist ein universeller Ansatz am Beispiel von Homematic. Licht an/aus steckt in der STATE Variable 29192. Diese Variable würde ich bei Thiemo’s Script im Array unter „Licht“ eintragen.

SetValueBoolean(29192, false) funktioniert aber nicht. Um dieses Licht auszuschalten müsste ich eingeben HM_WriteValueBoolean(13859, „STATE“, false)

Mit der Funktion SetValueUniversal(29192, Value) kann ich ohne Umwege Homematic mit der ID der Instanzvariablen schalten. Für EIB, FS20 und Co. sollte sich die Funktion leicht erweitern lassen, da es vermutlich ähnlich funktioniert.

SetValueUniversal(54457, 0.5) würde z.B. mein Homematic Rolle auf 50% fahren.

Die anhängenden Funktionen einfach in Thiemo’s Script kopieren und SetValueXXX(VarID, Value) durch SetValueUniversal(VarID, Value) ersetzen.


function SetValueUniversal($VariableID, $Value) {
	// Prüfe ob Variable direkt beschreibbar ist (nicht ReadOnly)
	if(IPS_GetObject($VariableID)['ObjectIsReadOnly'] === false) {
	   // Variable kann direkt gesetzt werden
	   SetValue($VariableID, $Value);
	} else {
	   // Variable ist eine Status Variable. Suche übergeordnete Instanz zum Beschreiben
	   $ParentID = IPS_GetObject($VariableID)['ParentID'];
	   // Den Namen des Ident der Variablen z.B. STATE
	   $ObjectIdent = IPS_GetObject($VariableID)['ObjectIdent'];
	   // Den Typ 0=Boolean, 1=Integer, 2=Float, 3=String
	   $VariableType = IPS_GetVariable($VariableID)['VariableValue']['ValueType'];
	   // Den Modul Type (siehe http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/modulverwaltung/ips-getmoduleList/)
	   $ModuleType = GetModuleType($ParentID);
		switch($ModuleType) {
		   case "HomeMatic Device":
					if($VariableType == 0) return HM_WriteValueBoolean($ParentID, $ObjectIdent, $Value);
					if($VariableType == 1) return HM_WriteValueInteger($ParentID, $ObjectIdent, $Value);
					if($VariableType == 2) return HM_WriteValueFloat($ParentID, $ObjectIdent, $Value);
					if($VariableType == 3) return HM_WriteValueString($ParentID, $ObjectIdent, $Value);
					break;
			case "FS20":
			      // ....
			      // ...
			      break;
			case "Alle meine genutzten Hardwaretypen":
			      // ...
			      // ..
			default:
			   // Modul nicht gefunden oder unterstüzt
			      return false;
		}
	}
}

function GetModuleType($ObjectID) {
	foreach(IPS_GetModuleList() as $guid) {
      $module = IPS_GetModule($guid)['ModuleName'];
      if(in_array($ObjectID, IPS_GetInstanceListByModuleID($guid))) {
         return $module;
		}
	}
	return "";
}

Und wenn die Variable jetzt Deckenlicht und nicht STATE heißt ???
Nimm statt IPS_GetName lieber IPS_GetObject und dann von der Rückgabe den Index [‚ObjectIden‘].
Das ist auch der Ident welchen du bei Homematic Write-Befehlen übergeben musst.
Michael

Ich verstehe momentan nicht worauf Du hinaus willst. HM_WriteValue will als zweiten Parameter den Namen der Instanz variablen haben. Und der ist gleich dem Namen des Homematic Datenpunktes. Ich glaube Deckenlicht versteht Homematic nicht. ?

Gesendet von meinem Nexus 4 mit Tapatalk

Der Name der Statusvariable ist nicht der 2. Parameter, sondern der Ident (der Statusvariable) welcher dem Datenpunkt von Homematic entspricht.
Leider ist die Doku von IPS da sogar falsch :frowning:
Hier mal ein Screenshot:

Du kannst und darfst alle Objekte umbenennen, auch Statusvariablen. Wenn du jetzt versuchts damit einen HM_Write* auszuführen gibt es einen Fehler.
Also mußt du schon den ObjectIdent holen und als 2. Parameter übergeben.

Michael