Steuerung von Geräten per Infrarot über mediola a.i.o. gateway

Hallo Zusammen,

ich bin komplett neu hier und bitte daher meine vielleicht banale Frage zu entschuldigen.

Ich besitze ein mediola a.i.o. gateway mit dem ich in Kombination mit einem Ipad alle meine Geräte im Wohnzimmer, die über Infrarot Befehle empfangen, steuere.

Ich würde nun gerne von IPS Geräte per Infrarot steuern ohne mir zusätzlich noch IRtrans zulegen zu müssen.

Das a.i.o. gateway erhält die Befehle einfach per http. Zum Einschalten des Fernsehers sendet man z.B.
http://192.168.X.X/command?code=003801C300AB1133FF2640010122335133511321232113112321231114001908&XC_FNC=Send2

Die Befehle vom Ipad werden per XML gesendet und wieder entgegengenommen.
Das Senden sieht so aus:


MCM:PLUGIN
XML
00000179
<?xml version="1.0"?>
<mctrlmessage>
<request name="ExecuteCommand" module="hcontrol">
<param name="command" value="Wohnzimmer.TV.toogle" />
</request>
</mctrlmessage>

Als Antwort erwartet dann das Ipad:


XML
00000121
<?xml version="1.0"?>
<mctrlmessage>
<response>
<return name="status" value="success" />
</response>
</mctrlmessage>

Ist es Grundsätzlich möglich folgendes Szenario mit IPS zu realisieren?
IPS empfängt XML vom Ipad, sendet dann den http Befehl an das Gateway und schickt dann eine XML Nachricht an das Ipad zurück.

Wenn jemand Vorschläge hat ob und wie dies mit IPS zu realisieren ist würde ich mich über Eure Antwort freuen.

Für HTTP Befehle kannst du dir das anschauen: PHP: file_get_contents - Manual (Ist dann ein einzeiler)

Für die anderen kannst du dir einen WebServer innerhalb von IPS erstellen, der deine XML Daten entgegennimmt, und ein PHP Skript erstellen, welches diese auswertet.

Alles in allem sollte das recht einfach zu lösen sein.

paresy

Ich benutze Windows Home Server 2011. Kann man da den ISS als Webserver benutzen oder muss ich nochmal separat im IPS Verzeichnis Apache installieren?

IP-Symcon hat einen WebServer mit drin. Du brauchst also weder IIS noch Apache.

paresy

Vielen Dank erstmal für die Tipps. Ich schicke jetzt mit file_get_contents die Befehle an das Gateway und kann nun die Geräte per Infrarot Code schalten. Jetzt schalte ich meinen Samsung Fernseher per IR an und steuere diesen dann über das Netzwerk aus IPS heraus.

Ich habe jetzt in IPS einen Webserver eingeschaltet, der auf den Port eingestellt ist auf dem das XML gesendet wird. Hier stehe ich nun leider mit meinen Anfängerkenntnissen auf dem Schlauch. Ich muss sicher eine index.php anlegen die dann das XML empfängt oder?
Wie stelle ich es an, das ich das XML, dass an den Webserver gesendet wird empfange und in eine Variable schreibe?

Ich habe jetzt das mit dem Webserver sein lassen. Stattdessen habe ich ein Serversocket eingerichtet. Die empfangenen Daten schreibe ich über ein Script in eine Register Variable.
Das Problem was ich jetzt noch habe ich das Zurücksenden der Daten. Ein Clientsocket kann ich nicht einrichten, da der Port auf dem der Ipad kommuniziert nur kurzfrstig beim Senden offen ist. Ich erhalte die Fehlermeldung Socket Error # 10061. Gibt es auch eine Möglichkeit über den Serversocket von IPS Daten unmittelbar wieder zurückzusenden oder wie gehe ich da am besten vor?

Das Senden der Befehle über file_get_contents klappt. Das von der Remote gesendete XML werte ich mit SimpleXML aus. Das XML will ich nun über den Serversocket wieder mit
SSCK_SendText($serversocket, $response);
zurückgeben. Mein Problem ist, ich möchte mir zur Kontrolle den Inhalt von $response als echo ausgeben lassen, damit ich sehe ob der zu sendende Inhalt stimmt aber echo zeigt mir nichts an.

Hat noch jemand einen Tipp. Wenn es so einfach ist, dann komme ich einfach nicht drauf wie ich das XML zurücksende. Oder muss ich dafür XML-RPC oder SOAP gebrauchen?

Schau dir mal IPS_LogMessage an. Das sollte genau dafür richtig sein :slight_smile:

paresy

Vielen Dank für den Hinweis. Manchmal sieht man den Wald vor lauter Bäumen nicht. Habe den Fehler jetzt gefunden und das XML wird zurückgeschickt. Jetzt funktioniert es grundsätzlich auch so wie ich mir das vorgestellt habe und der Status der Geräte wird an die AIO Remote zurückgeben.

Falls du Zeit hast wäre es cool, wenn deine Skripte in die Wiki oder hier im Forum veröffentlichen könntest. Dann würde alles anderen davon provitieren können :slight_smile:

paresy

Zur Zeit funktioniert das Ganze nur mit der Desktop Version der AIO Remote, auf dem Ipad gibt es hier wohl noch einen Bug. Dies liegt aber nicht an IPS sondern muss an der Ipad App von Mediola liegen. Sobald der Fehler in der AIO Remote App behoben ist und alles geprüft funktioniert stelle ich dann auch gerne ein fertiges Script zur Verfügung. Momentan steht auch nur die Kommunikation, ich muss das Script noch erweitern, das automatisch alle Codes der zu steuernden Geräte in IPS importiert werden.

Falls jemand FS20 Geräte von IPS mit dem AIO Gateway schalten will muss zunächst der Hauscode und die Adresse umgerechnet werden. HC1 und HC2 aus dem AIO Creator ergeben den achtstelligen Hauscode.


<?

$HC1 = "3421"; //HC1 Wert aus dem AIO Creator
$HC2 = "2143"; //HC2 Wert aus dem AIO Creator
$FS20_Adr = "1114"; // Adresse aus dem AIO Creator
$FS20_Code = $HC1.$HC2.$FS20_Adr;
$FS20_an = "1000";
$FS20_aus = "0000";

/*
0000 - Ausschalten
0100 - Auf 6,25% dimmen
0200 - Auf 12,50% dimmen (im Creator ~10%)
0300 - Auf 18,75% dimmen (im Creator ~20%)
0400 - Auf 25,00% dimmen
0500 - Auf 31,25% dimmen (im Creator ~30%)
0600 - Auf 37,50% dimmen (im Creator ~40%)
0700 - Auf 43,75% dimmen
0800 - Auf 50,00% dimmen (im Creator ~50%)
0900 - Auf 59,25% dimmen (im Creator ~60%)
0A00 - Auf 62,50% dimmen
0B00 - Auf 68,75% dimmen (im Creator ~70%)
0C00 - Auf 75,00% dimmen
0D00 - Auf 81,25% dimmen (im Creator ~80%)
0E00 - Auf 87,50% dimmen (im Creator ~90%)
0F00 - Auf 93,75% dimmen
1000 - Einschalten
1100 - Auf den letzten, gespeicherten Wert einschalten
1200 - Ein <-> Ausschalten (Toggle)
1300 - Hochdimmen
1400 - Runterdimmen
*/

echo "HC1 ist $HC1 
";
echo "HC2 ist $HC2 
";
echo "FS20 Adresse ist $FS20_Adr 
";
echo "FS20 Code ist $FS20_Code 
";


$arr1 = str_split($FS20_Code);

/* Stelle um 1 reduzieren */
for ($i = 0; $i <= 11; $i++)
	{
      $arr1[$i] = $arr1[$i] -1;
   }

/* Aufteilung in Zweierblöcke */
/* Die jeweils erste Zahl eines Blocks wird mit 4 multipliziert und mit der zweiten Zahl addiert */
for ($i = 0; $i <= 10; $i=$i+2)
	{
      $arr2[$i] = $arr1[$i] * 4 + $arr1[$i+1];
   }

/* Jeder Block wird nun in seine Hexadezimaldarstellung überführt (0-9, A-F) */
for ($i = 0; $i <= 10; $i=$i+2)
	{
      $arr2[$i] = dechex($arr2[$i]);
   }

$FS20_send = $arr2[0].$arr2[2].$arr2[4].$arr2[6].$arr2[8].$arr2[10];
print "Der berechnete Code lautet $FS20_send 
";

$aio_send = "http://192.168.55.116/command?XC_FNC=SendSC&type=FS20&data=".$FS20_send.$FS20_an;
print "Zum Einschalten ist an das A.I.O. Gateway  $aio_send zu senden.
";
$aio_send = "http://192.168.55.116/command?XC_FNC=SendSC&type=FS20&data=".$FS20_send.$FS20_aus;
print "Zum Ausschalten ist an das A.I.O. Gateway  $aio_send zu senden.
";

?>

Geschaltet wird dann per Script


file_get_contents("http://192.168.55.116/command?XC_FNC=SendSC&type=FS20&data=b44e021000");

Ideal wäre es natürlich wenn man zu einem späteren Zeitpunkt einfach bei einem neu angelegten FS20 Gerät dies mit einer übergeordneten Instanz die das AIO Gateway darstellt verknüpfen kann.

Eine komplette Beschreibung wie die Befehle an das Gateway zu übergeben sind findet man hier:

So ich habe jetzt den Fehler gefunden, warum es nicht mit der AIO Remote auf dem Ipad funktioniert. Das Ganze hängt wohl damit zusammen, dass der Response nur kurz gesendet werden darf. Über den Server Socket von IPS wird der Response aber wohl kontinuierlich wiederholt.

Ich habe mir jetzt mit einer unkonventionellen Methode beholfen indem ich einfach den Port des Serversockets nach dem Senden vom Response wechsle.


// ändert kurz den Port des Server Sockets damit eine Kommunikation mit dem Ipad klappt. Danach ist der Port wieder auf den mControl Port vom AIO Creator zurückzusetzten
    SSCK_SetPort($serversocket,9999); // wechselt den Port
    SSCK_SetLimit($serversocket,1); // maximal 1 Client gleichzeitig
    SSCK_SetOpen($serversocket,true); // Port öffnen
    IPS_ApplyChanges($serversocket);

// Warte 0,2 Sekunden
usleep(200000);

// ändert den Port des Server Sockets zurück auf den mControl Port vom AIO Creator
    SSCK_SetPort($serversocket,8088); // wechselt den Port auf den mControl Port
    SSCK_SetLimit($serversocket,1); // maximal 1 Client gleichzeitig
    SSCK_SetOpen($serversocket,true); // Port öffnen
    IPS_ApplyChanges($serversocket);

Mit diesem Vorgehen funktioniert nun auch das Zurückgeben des Status zur AIO Remote auf dem Ipad. Allerdings bin ich damit nicht so recht zufrieden.

Gibt es eine Möglichkeit nach einer bestimmten Zeit das Senden auf dem Server Socket einzustellen oder diesen kurz zu schließen und wieder zu öffnen?

Ich habe jetzt mal einen neuen Thread aufgemacht, indem auch das Skript, dass das XML entgegennimmt und zurücksendet enthalten ist. Zu finden hier:
http://www.ip-symcon.de/forum/f53/anbindung-mediola-aio-remote-aio-gateway-steuerung-ir-geraeten-15840/#post136626