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