LightManager Air

Hi,
bevor ich vor einem Jahr mit IPS anfing hatte (habe noch) einen Lightmanager Air. Die Szenen lassen sich sehr leicht aus IPS aufrufen mit:


file_get_contents("http://<IP des LM>/control?scene=1);

So wird Szene 1 gestartet das wäre das selbe als wenn man mit einer Harmony L001 an den LM schicken würde.

Es ist also kinderleicht. Ich habe ein Script geschrieben mit dem es kinderleichter wird:-)

Das Script:


<?php
// Die ganzen Idents werden benutzt damit nicht jeder Aufruf erneut alles anlegt

// IP vom LeightManager Air
$IP = '192.168.178.49';

// Lege Stringvariable für Konfiguration an falls noch nicht vorhanden
$ConfigID = IPS_GetObjectIDByIdent("Config", $_IPS['SELF']);
if ($ConfigID == false){
    $ConfigID = IPS_CreateVariable(3);
    IPS_SetName($ConfigID, "Config"); // Variable benennen
    IPS_SetParent($ConfigID, $_IPS['SELF']); 
    IPS_SetIdent($ConfigID, "Config"); 
}
// Lese Konfiguration aus LM
if (file_exists('http://'.$IP.'/config.xml')){
    $file = implode(gzfile('http://'.$IP.'/config.xml'));
}
else{
// Lese Konfiguration aus Variable
    $file = GetValue($ConfigID);
}

// Konfiguration in Variable speichern
SetValue($ConfigID, $file);

// Konfiguration ist eine XML Datei
$xml = simplexml_load_string($file);

// XML -> Json
$json = json_encode($xml);

// Jason -> Array
$array = json_decode($json,TRUE);

// Für Debug-Zwecke
//var_dump($xml);
//return;

// Anlegen einer neuen Kategorie mit dem Namen "Szenen" falls nocht nicht vorhanden
$CatID = IPS_GetObjectIDByIdent("Szenen", $_IPS['SELF']);
if ($CatID == false){
    $CatID = IPS_CreateCategory();              // Kategorie anlegen
    IPS_SetName($CatID, "Szenen");              // Kategorie benennen
    IPS_SetParent($CatID, $_IPS['SELF']);       // Kategorie einsortieren unter dem Objekt
    IPS_SetIdent($CatID, "Szenen");
}

// Alle Szenen als Scripte anlegen wenn noch nicht vorhanden
$i1 = 0;
while ($xml->lightscenes->scene[$i1]){
    $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->lightscenes->scene[$i1]->name);
    $ScriptID = IPS_GetObjectIDByIdent($ident, $CatID);
    if ($ScriptID == false){
        $ScriptID = IPS_CreateScript(0);        // Script erzeugen
        IPS_SetParent($ScriptID, $CatID);       // Script einsortieren unter dem Objekt
        IPS_SetName($ScriptID, (string) $xml->lightscenes->scene[$i1]->name);       // Script bennenen
        IPS_SetIdent($ScriptID, $ident);
    }
// Script zusammenbasteln ist einfach nur "http://<IP vn LM>/control?scene=x"
    $content = "<?\rfile_get_contents('http://".$IP."/control?".(string) $xml->lightscenes->scene[$i1]->param."');\r?>";
    IPS_SetScriptContent($ScriptID, $content);
    $i1++;
}

// Anlegen einer neuen Kategorie mit dem Namen "Zonen" falls nocht nicht vorhanden
// Zonen enthalten die einzelnen Kommandos der Geräte aus den Szenen
$CatID = IPS_GetObjectIDByIdent("Zonen", $_IPS['SELF']);
if ($CatID == false){
    $CatID = IPS_CreateCategory();              // Kategorie anlegen
    IPS_SetName($CatID, "Zonen");               // Kategorie benennen
    IPS_SetParent($CatID, $_IPS['SELF']);       // Kategorie einsortieren unter dem Objekt
    IPS_SetIdent($CatID, "Zonen");
}
$i1 = 0;

// Anlegen einer neuen Kategorie mit dem Zonen-Name falls nocht nicht vorhanden
while ($xml->zone[$i1]){
    $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->zone[$i1]->zonename);
    $ZoneID = IPS_GetObjectIDByIdent($ident, $CatID);
    if ($ZoneID == false){
        $ZoneID = IPS_CreateCategory();
        IPS_SetName($ZoneID, (string) $xml->zone[$i1]->zonename); // Variable benennen
        IPS_SetParent($ZoneID, $CatID); 
        IPS_SetIdent($ZoneID, $ident);
    }
    $i2 = 0;
// Anlegen einer neuen Kategorie mit dem Aktuator-Name falls nocht nicht vorhanden
    while ($xml->zone[$i1]->actuators->actuator[$i2]){
        $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->zone[$i1]->actuators->actuator[$i2]->name);
        $ActuatorsID = IPS_GetObjectIDByIdent($ident, $ZoneID);
        if ($ActuatorsID == false){
            $ActuatorsID = IPS_CreateCategory();
            IPS_SetName($ActuatorsID, (string) $xml->zone[$i1]->actuators->actuator[$i2]->name); // Variable benennen
            IPS_SetParent($ActuatorsID, $ZoneID); 
            IPS_SetIdent($ActuatorsID, $ident);
        }
        $i3 = 0;
// Anlegen eines neuen Scripts mit dem Kommando-Name falls nocht nicht vorhanden
        while ($xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]){
            $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]->name);
            $ScriptID = IPS_GetObjectIDByIdent($ident, $ActuatorsID );
            if ($ScriptID == false){
                $ScriptID = IPS_CreateScript(0);
                IPS_SetName($ScriptID, (string) $xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]->name); // Variable benennen
                IPS_SetParent($ScriptID, $ActuatorsID ); 
                IPS_SetIdent($ScriptID, $ident);
            }
// Script zusammenbasteln ist einfach nur "http://<IP vn LM>/control?" und der Parameter aus dem XML
            $content = "<?\rfile_get_contents('http://".$IP."/control?".(string) $xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]->param."');\r?>";
            IPS_SetScriptContent($ScriptID, $content);
            $i3++;
        }
        $i2++;
    }
    $i1++;
}
?>

liest die aktuelle Konfiguration vom LM aus. Im Script muss nur die IP vom LM eingetragen werden und dann gestartet werden.

Das Script legt die aktuelle Konfiguration vom LM in der Variablen „Config“ ab um bei Fehlersuche hilfreich zu sein. Es werden 2 Kategorien „Szenen“ und „Zonen“ angelegt. In „Szenen“ liegen Scripte mit den Szenen-Namen die die jeweilige Szene starten. „Zonen“ enthält auch die Szenen aber darin sind alle Aktoren mit Scripten abgespeichert. Für das Web-Front empfiehlt es sich direkt die LM-Web-Seite als externe Seite einzurichten.

Vielleicht hilft es ja jemanden.

Ralf

Vielen Dank für das Skript. Die Idee ist super und ich würde meinen LMAIR gerne in IPS einbinden.
Nach Austausch der IP des LMAIR erhalte ich jedoch nach Ausführung des Skripts folgende Fehlermeldung:

Warning:  Objekt mit Ident Config wurde nicht gefunden in /var/lib/symcon/scripts/21301.ips.php on line 8

Warning:  Objekt mit Ident Szenen wurde nicht gefunden in /var/lib/symcon/scripts/21301.ips.php on line 41

Notice:  Trying to get property 'lightscenes' of non-object in /var/lib/symcon/scripts/21301.ips.php on line 51

Notice:  Trying to get property 'scene' of non-object in /var/lib/symcon/scripts/21301.ips.php on line 51

Notice:  Trying to access array offset on value of type null in /var/lib/symcon/scripts/21301.ips.php on line 51

Warning:  Objekt mit Ident Zonen wurde nicht gefunden in /var/lib/symcon/scripts/21301.ips.php on line 68

Notice:  Trying to get property 'zone' of non-object in /var/lib/symcon/scripts/21301.ips.php on line 78

Notice:  Trying to access array offset on value of type null in /var/lib/symcon/scripts/21301.ips.php on line 78
 writing your code here

Kannst du mir hier weiterhelfen?
Viele Grüße
marvus

Moin Marvus,
ich habe es bei mir mal getestet und es lief auch nicht. Ich habe das Script mal etwas geändert. Versuch dieses Script mal.

<?php
// Die ganzen Idents werden benutzt damit nicht jeder Aufruf erneut alles anlegt

// IP vom LeightManager Air
$IP = '192.168.178.49';

// Lege Stringvariable für Konfiguration an falls noch nicht vorhanden
$ConfigID = @IPS_GetObjectIDByIdent("Config", $_IPS['SELF']);
if ($ConfigID == false){
    $ConfigID = IPS_CreateVariable(3);
    IPS_SetName($ConfigID, "Config"); // Variable benennen
    IPS_SetParent($ConfigID, $_IPS['SELF']); 
    IPS_SetIdent($ConfigID, "Config"); 
}
// Lese Konfiguration aus LM
$file = @gzfile('http://'.$IP.'/config.xml');
if ($file != false){
    $config = implode($file);
}
else{
// Lese Konfiguration aus Variable
    $config = GetValue($ConfigID);
}

if ($config == ''){
    IPS_LogMessage("LM Air", "Konfiguration oder LM Air nicht gefunden "); 
}

// Konfiguration in Variable speichern
SetValue($ConfigID, $config);

// Konfiguration ist eine XML Datei
$xml = simplexml_load_string($config);

// XML -> Json
$json = json_encode($xml);

// Jason -> Array
$array = json_decode($json,TRUE);

// für Debug Zwecke
//var_dump($array);
//return;

// Anlegen einer neuen Kategorie mit dem Namen "Szenen" falls nocht nicht vorhanden
$CatID = @IPS_GetObjectIDByIdent("Szenen", $_IPS['SELF']);
if ($CatID == false){
    $CatID = IPS_CreateCategory();              // Kategorie anlegen
    IPS_SetName($CatID, "Szenen");              // Kategorie benennen
    IPS_SetParent($CatID, $_IPS['SELF']);       // Kategorie einsortieren unter dem Objekt
    IPS_SetIdent($CatID, "Szenen");
}

// Alle Szenen als Scripte anlegen wenn noch nicht vorhanden
$i1 = 0;
while ($xml->lightscenes->scene[$i1]){
    $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->lightscenes->scene[$i1]->name);
    $ScriptID = @IPS_GetObjectIDByIdent($ident, $CatID);
    if ($ScriptID == false){
        $ScriptID = IPS_CreateScript(0);        // Script erzeugen
        IPS_SetParent($ScriptID, $CatID);       // Script einsortieren unter dem Objekt
        IPS_SetName($ScriptID, (string) $xml->lightscenes->scene[$i1]->name);       // Script bennenen
        IPS_SetIdent($ScriptID, $ident);
    }
// Script zusammenbasteln ist einfach nur "http://<IP vn LM>/control?scene=x"
    $content = "<?\rfile_get_contents('http://".$IP."/control?".(string) $xml->lightscenes->scene[$i1]->param."');\r?>";
    IPS_SetScriptContent($ScriptID, $content);
    $i1++;
}

// Anlegen einer neuen Kategorie mit dem Namen "Zonen" falls nocht nicht vorhanden
// Zonen enthalten die einzelnen Kommandos der Geräte aus den Szenen
$CatID = @IPS_GetObjectIDByIdent("Zonen", $_IPS['SELF']);
if ($CatID == false){
    $CatID = IPS_CreateCategory();              // Kategorie anlegen
    IPS_SetName($CatID, "Zonen");               // Kategorie benennen
    IPS_SetParent($CatID, $_IPS['SELF']);       // Kategorie einsortieren unter dem Objekt
    IPS_SetIdent($CatID, "Zonen");
}
$i1 = 0;

// Anlegen einer neuen Kategorie mit dem Zonen-Name falls nocht nicht vorhanden
while ($xml->zone[$i1]){
    $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->zone[$i1]->zonename);
    $ZoneID = @IPS_GetObjectIDByIdent($ident, $CatID);
    if ($ZoneID == false){
        $ZoneID = IPS_CreateCategory();
        IPS_SetName($ZoneID, (string) $xml->zone[$i1]->zonename); // Variable benennen
        IPS_SetParent($ZoneID, $CatID); 
        IPS_SetIdent($ZoneID, $ident);
    }
    $i2 = 0;
// Anlegen einer neuen Kategorie mit dem Aktuator-Name falls nocht nicht vorhanden
    while ($xml->zone[$i1]->actuators->actuator[$i2]){
        $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->zone[$i1]->actuators->actuator[$i2]->name);
        $ActuatorsID = @IPS_GetObjectIDByIdent($ident, $ZoneID);
        if ($ActuatorsID == false){
            $ActuatorsID = IPS_CreateCategory();
            IPS_SetName($ActuatorsID, (string) $xml->zone[$i1]->actuators->actuator[$i2]->name); // Variable benennen
            IPS_SetParent($ActuatorsID, $ZoneID); 
            IPS_SetIdent($ActuatorsID, $ident);
        }
        $i3 = 0;
// Anlegen eines neuen Scripts mit dem Kommando-Name falls nocht nicht vorhanden
        while ($xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]){
            $ident = preg_replace("/[^0-9a-zA-Z]/", "", (string) $xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]->name);
            $ScriptID = @IPS_GetObjectIDByIdent($ident, $ActuatorsID );
            if ($ScriptID == false){
                $ScriptID = IPS_CreateScript(0);
                IPS_SetName($ScriptID, (string) $xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]->name); // Variable benennen
                IPS_SetParent($ScriptID, $ActuatorsID ); 
                IPS_SetIdent($ScriptID, $ident);
            }
// Script zusammenbasteln ist einfach nur "http://<IP vn LM>/control?" und der Parameter aus dem XML
            $content = "<?\rfile_get_contents('http://".$IP."/control?".(string) $xml->zone[$i1]->actuators->actuator[$i2]->commandlist->command[$i3]->param."');\r?>";
            IPS_SetScriptContent($ScriptID, $content);
            $i3++;
        }
        $i2++;
    }
    $i1++;
}
?>

Ach ja falls die Konfiguration nicht gelesen werden kann steht es im Logfile von IPS.

Ralf

Hallo Ralf,
vielen Dank. Ich hatte es erst jetzt gesehen. Normalerweise bekomme ich immer eine Mail.

Das Skript funktioniert jetzt und liest alles aus. Perfekt :ok_hand:t2:
Vielen Dank.

Der LMAIR unterstützt ab sofort das Schwimmbadthermometer TFA 30.3066.01. Ich spiele mit dem Gedanken mir das Ding anzuschaffen.
Gibt es auch eine Möglichkeit über den LMAIR das Thermometer als Variable in IPS zu bekommen?

Viele Grüße
marvus

Hi,
freut mich. Ob man so an Sensor-Werte kommt kann ich (noch) nicht sagen.

Ralf