Mit Hilfe des AIO Gateways sind Geräte bedienbar, die sonst über IR-Fernbedienungen oder mit Funk 433/868 MHz steuerbar sind. Das AIO Gateway unterstützt auch die Steuerung von FS20 Komponenten.
Die AIO Remote ist die Steuerungssoftware die für verschiedene Softwareplattformen verfügbar ist unter anderm auch für iOS.
Die Kommunikation der AIO Remote erfolgt mit IPS über XML. Das AIO Gateway erhält die Befehle per http.
Mit Hilfe der Skripte und ein bischen Basteln ist eine Anbindung der AIO Remote und des AIO Gateways an IPS möglich.
Zur Anbindung der AIO Remote werden im AIO Creator ein mControl 1.0 Server als Gateway angelegt. Die ausgesuchte Portnummer des Servers ist zu notieren.
Anschließend können Geräte mit dem Gateway mControl im AIO Creator angelegt werden. Hier ist die Bezeichnung sowie der Bereich und Gerät zu notieren.
In IPS wird nun zunächst ein Serversocket eingerichtet mit der Portnummer die im AIO Creator vergeben worden ist. Anschließend legt man eine Registervariable an, die man mit dem Server Socket verknüpft. Die Registervariable startet folgendes Zielskript:
// neu empfangene Daten an $data übergeben
$data = $IPS_VALUE;
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($IPS_INSTANCE, $data);
IPS_LogMessage( "Empfangen von AIO Remote" , $data );
//Anfang vor XML abschneiden
$ONLY_XML= substr($data, strpos ($data,'<'),strlen($data) - strpos ($data,'<'));
$xml = simplexml_load_string($ONLY_XML,'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
$kind = $xml->request->attributes()->name;
// Auf Befehl oder Statusabfrage prüfen
// Wenn ExecuteCommand dann Befehl ausführen
if ($kind == "ExecuteCommand")
{
// Gerät auslesen
// Value auslesen
$valuerow = $xml->request->param->attributes()->value;
$value = (string) $valuerow;
SetValue(47585 /*[Server Socket AIO Remote\XML_Get\Commandvalue]*/, $value); /* Setzt den Status */
$value = GetValue(47585 /*[Server Socket AIO Remote\XML_Get\Commandvalue]*/); // Value des Geräts auslesen
IPS_LogMessage( "Value:" , $value );
if ($value == 'Gruppe.Geraetename.Befehl')
{
$status = GetValue(47786 /*[Mittelgeschoss\Bad\Status]*/); // Status des Geräts auslesen
if ($status == "off")// Befehl ausführen
{
IPS_LogMessage( "Befehl ausführen:" , "Anschalten" );
IPS_RunScript(25449 /*[Mittelgeschoss\Bad\Beleuchtung an]*/);
}
elseif ($status == "on")// Befehl ausführen
{
IPS_LogMessage( "Befehl ausführen:" , "Ausschalten" );
IPS_RunScript(49886 /*[Mittelgeschoss\Bad\Beleuchtung aus]*/);
}
// Warte 0,5 Sekunden
usleep(500000);
$status = GetValue(47786 /*[Mittelgeschoss\Bad\Status]*/); // Status des Geräts auslesen
IPS_LogMessage( "Status:" , $status );
}
elseif ($value == 'Wohnzimmer.Lampe.toggle')
{
$status = GetValue(24890 /*[Erdgeschoss\Wohnzimmer\Steckdosen\Stehlampe\Status]*/); // Status des Geräts auslesen
IPS_LogMessage( "Wohnzimmerlampe erkannt:" , "Richtig" );
if ($status == "off")// Befehl ausführen
{
IPS_LogMessage( "Befehl ausführen:" , "Anschalten" );
IPS_RunScript(49661 /*[Erdgeschoss\Wohnzimmer\Steckdosen\Stehlampe\Stehlampe an]*/);
}
elseif ($status == "on")// Befehl ausführen
{
IPS_LogMessage( "Befehl ausführen:" , "Ausschalten" );
IPS_RunScript(58174 /*[Erdgeschoss\Wohnzimmer\Steckdosen\Stehlampe\Stehlampe aus]*/);
}
// Warte 0,5 Sekunden
usleep(500000);
$status = GetValue(24890 /*[Erdgeschoss\Wohnzimmer\Steckdosen\Stehlampe\Status]*/); // Status des Geräts auslesen
IPS_LogMessage( "Status:" , $status );
}
// Hier sind die Geräte zu ergänzen die im AIO Creator angelegt worden sind
elseif ($value == 'Gruppe.Geraetename.Befehl')
{
echo "hier wird dann der Befehl ausgelöst
";
}
// Rückmeldung des Gerätestatus
include '35452.ips.php'; //aiocommandresponse.xml
$xmlhead1 = "XML
";
// Generiert XML Response
$len = strlen($xmlstr); // Länge des XML
$xmlhead2 = str_pad($len, 8, "0", STR_PAD_LEFT)."
"; // gibt die Länge als 8 stellige Zahl mit führenden Nullen aus
$response = $xmlhead1.$xmlhead2.$xmlstr;
//Response versenden
include '33645.ips.php'; //sendresponse.xml
IPS_LogMessage( "Response auf Command:" , $response );
}
// Wenn Statusabfrage
// Wenn GetStates dann Statusabfrage zurücksenden
if ($kind == "GetStates")
{
include '43079.ips.php'; //aiostatusresponse.xml
$count = $xml->request->param->count(); //Anzahl der Param Childs im Request
$xmlreq = new SimpleXMLElement($xmlresponse);
for ($i = 0; $i <= $count-1; $i++)
{
$regxmlname = $xml->request->param[$i]->attributes()->name; // liest Gerätenamen aus
// print utf8_decode($xml->request->param[$i]->attributes()->name)."
<br>"; // Gerätename
$xmlreturn = $xmlreq->response->addChild('return');
$xmlreturn->addAttribute('name', $regxmlname); // Legt neues Child und Attribut mit Gerätenamen an
if ($regxmlname == "Steckdosen.Bad")
{
$status = GetValue(47786 /*[Mittelgeschoss\Bad\Status]*/); // Status des Geräts auslesen
$xmlreturn->addAttribute('value', $status);
}
elseif ($regxmlname == "Garten.Terasse")
{
$status = GetValue(56062 /*[Garten\Terassenbeleuchtung\Terassenbeleuchtung\Status]*/); // Status des Geräts auslesen
$xmlreturn->addAttribute('value', $status);
}
// Hier sind die Geräte zu Ergänzen die im AIO Creator angelegt worden sind
}
$xmlhead1 = "XML
";
$xmllen = $xmlreq->asXML();
// Generiert XML Response
$len = strlen($xmllen); // Länge des XML
$xmlhead2 = str_pad($len, 8, "0", STR_PAD_LEFT)."
"; // gibt die Länge als 8 stellige Zahl mit führenden Nullen aus
$response = $xmlhead1.$xmlhead2.$xmllen;
// SetValue(34546 /*[Server Socket AIO Remote\XML_Get\XML_Daten]*/, $data); /* Setzt den Status */
include '33645.ips.php'; //sendresponse.xml
IPS_LogMessage( "Response auf Request:" , $response );
}
Das Zielskript nimmt das gesendete XML der AIO Remote entgegen und generiert den passenden XML Response.
Im Skript sind weitere Skripts eingebunden die aufgerufen werden.
aiocommandresponse:
$xmlstr = <<<XML
<?xml version="1.0"?>
<mctrlmessage>
<response>
<return name="status" value="success" />
</response>
</mctrlmessage>
XML;
Ist immer gleich und wird auf ein Command als Response an die AIO remote zurückgesendet.
aiostatusresponse:
// Beachte keine Umlaute im Creator verwenden
$xmlresponse = <<<XML
<?xml version="1.0"?>
<mctrlmessage>
<response>
</response>
</mctrlmessage>
XML;
Enthält das XML Grundgerüst das dann durch das Skript ergänzt wird.
sendresponse:
<?
$serversocket = 16770 /*[Server Socket AIO Remote]*/;
SSCK_SendText($serversocket, $response);
SSCK_SetOpen($serversocket,false); // Port schließen
IPS_ApplyChanges($serversocket);
SSCK_SetOpen($serversocket,true); // Port öffnen
IPS_ApplyChanges($serversocket);
?>
Sendet den Response und schließt kurz den Serversocket damit die Kommunikation z.B. mit dem Ipad funktioniert.
Die Befehle an das AIO Gateway werden per http gesendet. Eine komplette Beschreibung wie die Befehle an das Gateway zu übergeben sind findet man hier:
Ein Befehl sind dann so aus:
$FS20_Code = GetValue(11287 /*[Mediola\IP_AIO_Gateway]*/).GetValue(27093 /*[Mediola\FS20\FS20_sendstring]*/).GetValue(48558 /*[Garten\Quellstein\Hexcode Beleuchtung]*/).GetValue(22886 /*[Mediola\FS20\FS20_ein]*/);
file_get_contents("http://$FS20_Code");
$status = "on";
SetValue(29231 /*[Garten\Quellstein\Status Beleuchtung]*/, $status); /* Setzt den Status */
Es wird jeweils eine Variable für das Gerät benötigt um den Status des Geräts zu speichern.
Der Code zum Senden an ein FS20 Gerät kann wie folgt berechnet werden:
<?
$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.
";
?>
Viel Erfolg beim Ausprobieren allen die AIO Remote und ein AIO Gateway besitzten.
Fonzo