V2.3 - First-Steps

An dieser Stelle zeigen wir anhand von kleinen Flash / SWF Filmen die Gundfunktionen von IP-Symcon.

Voraussetzung bei allen Beispielen ist immer eine korrekt angeschlossene Hardware
und richtig installierte Treiber sowie die aktuelle Version IPS 2.0

Den Anfang macht ein Aktor: die FS20 Steckdose:

  1. „Instanz erstellen“
  2. „Hersteller“ & „Gerät“ auswählen
  3. ggf. Name ändern z.B. „Deckenfluter Wohnzimmer“
  4. gewünschten Hauscode / Adresse eingeben
  5. „Übernehmen“ drücken
  6. Gerät gemäß Bedienungsanleitung anlernen
  7. Test: „AN“ / „AUS“
  8. „OK“ - fertig
    SWF - Film

MST

Instanzen sind einzelne Module, die z.B. dafür sorgen, daß eine Funksteckdose die Befehle zum Ein- u. Ausschalten korrekt erhält.
Sie können sich ihre Aufgaben mit anderen Modulen teilen.
Ein „Splitter“ sorgt sich dann um den richtigen „Datenfluß“, „zerlegt“ einzelne Datenpakete
und gibt sie dann an die entsprechenden Instanzen weiter.
Diese können dann direkt mit den Treiber der angeschlossenen Hardware kommunizieren.
Der Anwender muss zum Glück davon nichts wissen - dies erledigt IP-Symcon für ihn - er kann es aber kontrollieren oder ggf. ändern.

Beispiel:
Die Instanz einer FS20-Steckdose kommuniziert mit dem „Splitter FHZ“ und dieser wiederum mit der „I/O Instanz FTDI“

SWF - Film

MST

… nur eine Zeile, um eine Steckdose einzuschalten …

  1. „Skript erstellen“
  2. einen Namen vergeben
  3. Skript auswählen (Doppelklick)
  4. „Strg und SPACE“ drücken > Funktionsübersicht
  5. „FS“ eingeben > die Auswahl wird reduziert auf die FS20-Befehle > „FS20_SwitchMode“
  6. Klammer öffnen „(“ und „Strg und O“ für den „Objektbaum“
  7. gewünschtes Gerät auswählen
  8. Komma „,“ True und „);“ eingeben
  9. „Speichern“
  10. Test: Ausführern > die Steckdose wird eingeschaltet

SWF - Film

MST

Wie schalte ich ein Gerät täglich von Montag bis Freitags
um 8:00 Uhr ein?

  1. in dem betreffenden Skript aus „Ereignis“ klicken
  2. und „zyklisches Ereignis“ wählen
  3. „Wöchentlich“ und die gewünschten Tage auswählen
  4. als „Zeitmuster“ „einmalig“ - fertig

SWF - Film

MST

In IP-Symcon können einzelne Fenster nach belieben verschoben werden oder an andere angedockt werden.
So geht es: das betreffende Fenster auf seinen Namen klicken und dann zur gewünschten Position ziehen.
Diese werden durch die vier blauen Symbole an den Seitenrändern angezeigt.
(in der Release-Version können die Einstellungen gespeichert werden)

SWF - Film

MST

Die Installation von IP-Symcon ist sehr einfach.
Man benötigt einen Benutzernamen, eine gültige Update-Berechtigung sowie einen Internetzugang.

  1. Programm „ips_live.exe“ starten
  2. die Lizenzbedingungen lesen und ggf. zustimmen
  3. Installation-Pfad angeben
  4. Benutzernamen und den Pfad des Lizenz-Key angeben
  5. es wird eine Verbindung zu unserem File-Server aufgebaut
  6. benötigte Module auswählen
  7. Download abwarten
  8. Dienst starten
  9. Konsole starten

WMV - Film

MST

Das folgende Beispiel zeigt die man einen 1-Wire Temperaturfühler hinzufügt:

  1. „Instanz erstellen“
  2. "Hersteller"auswählen
  3. „Gerät“ auswählen (im Grunde egal welches, da IPSymcon alle gefundenen Geräte anzeigt)
  4. ggf. Name ändern z.B. „1Wire Temperatur Fühler“
  5. „Search“ drücken und gewünschtes Gerät auswählen
  6. hier eine Timer-Zeit angeben, die angibt, wie oft Werte abgefragt werden
  7. „Übernehmen“ drücken
  8. für ein Test: „Lesen“ und „OK“
  9. der Name der Variablen wurde von IPS automatisch vergeben: „Temperatur“ - dieser lässt sich natürlich ändern z.B.: „Vorlauf Heizung“"
  10. SUPER es hat geklappt: 19,8125 Grad in der Bude :rolleyes:

SWF - Film

MST

… oder einfacher gesagt: Skripte starten, wenn ein Ereignis eintritt.
In diesem Beispiel soll eine E-Bad-Heizung eingeschaltet werden, wenn die Temperatur unter 21 Grad sinkt.

  1. „Skript erstellen“ (oder vorhandenes wie hier verwenden)
  2. einen Namen vergeben
  3. Skript auswählen (Doppelklick)
  4. PHP-Code eingeben
FS20_SwitchDuration(21857, True, 6 * 60);   // E-Bad Heizkörper für 6 min. einschalten
  1. "Ereignis"und „Ausgelöstes Ereignis“ wählen
  2. „Variable auswählen“
  3. „Bei Grenzwertunterschreitung“ und 21,00 eingeben
  4. „OK“ und fertig

Anmerkung: HMS Sensoren senden ca. 5 Minuten Werte.
Die Elektroheizung-Heizung wird für 6 Minuten (6*60 sec) eingeschalten.
Die FS20 Steckdose übernimmt das automatische Ausschalten - ein wichtiger Sicherheitsaspekt!
Ein Ausschalt-Befahl per Skript ist hier also nicht zwingend notwendig.

SWF - Film

MST

… oder wie bekomme ich das neuste IP-Symcon?

  1. in der Console auf „Aktualisieren“ klicken
  2. „IP-Symcon aktualisieren“ auswählen
  3. es wird eine Verbindung zu unserem File-Server aufgebaut
  4. benötigte Module auswählen
  5. Download abwarten
  6. Dienst starten
  7. Konsole starten

SWF - Film

MST

Das folgende Beispiel zeigt die man das ALL4000 Ethernet Sensormeter hinzufügt:

  1. „Instanz erstellen“
  2. "Hersteller"auswählen
  3. „Gerät“ auswählen
  4. ggf. Name ändern z.B. „All4001 SI-Kasten“"
  5. IP-Adresse eingeben
  6. „Übernehmen“ drücken
  7. „Suchen“ drücken
  8. die gefundenen Sensoren werden angezeigt
  9. „OK“ - fertig

SWF - Film

MST

Das folgende Beispiel zeigt wie eine Steckdose des HomeMatic System angelernt wird:

  1. „Instanz erstellen“
  2. „Hersteller"auswählen“ > hier „ELV“
  3. „Gerät“ auswählen > hier „Homematic Empfänger“
  4. ggf. Name ändern z.B. „Steckdose Lampe“"
  5. „Suchen“
  6. „Kanal-Taste“ an der Steckdose drücken
  7. Seriennummer wird übertragen und aufgelistet
  8. auf die betreffende „Seriennummer“ Doppel-Klick
  9. „OK“
  10. das Gerät wird im Baumdiagramm aufgelistet
  11. ! ACHTUNG ! erst nach erneutem drücken „Kanal-Taste“ werden die
    zugehörigen Variablen „STATE“ und „WORKING“ zusätzlich im Baumdiagramm aufgelistet

SWF - Film

MST

Da es sich beim HomeMatic System um ein bidirektionales handel,
kann man davon ausgehen, dass in „LEVEL“ der aktuelle IST-Wert ist - in diesem Beispiel der aktuelle Dim-Wert.
Möchte man diesen z.B. über einen Schieberegler im Designer ändern,
so geschieht dies, in dem man eine 2. Variable anlegt. In dieser steht der Soll-Wert
Im folgenden Skript startet (triggert) die Variable das folgende Skript:
Ereignis: Bei Änderung der Variable „Soll_Wert-Designer“

$id_halo = 20482 /*[OG\Büro\Büro Halogen]*/;
$soll_wert = GetValue(12619 /*[OG\Büro\Büro Halogen\Soll_Wert_Designer]*/)/ 100;
HM_WriteValueFloat($id_halo, "LEVEL" , $soll_wert)

Bei jeder Änderung der Position des Schiebereglers geschiert folgendes:

  1. der Soll-Wert ändert sich, da dieser im Designer mit der Variable mit „OnChange“ verknüpft ist
  2. IPS sendet den Wert an die CCU
  3. diese führt den Befehl aus: „WORKING = TRUE“
  4. Helligkeit der Lampe ändert sich
  5. neuer IST-Wert wird in „LEVEL“ angezeigt

Hierzu ein SWF - Film

MST

Das folgende Beispiel zeigt wie man eine S7-SPS hinzugefügt wird:
(natürlich geht auch die preiswertere VIPA Speed7 - getestet mit CPU315SN)

  1. „Instanz erstellen“
  2. „Hersteller"auswählen“ > hier „Siemens“
  3. „Gerät“ auswählen > hier „Siemens SPS“
  4. ggf. Name ändern z.B. „S7 Palettierer“
  5. in der „Übergeordneten Instanz“ die notwendigen Einstellungen treffen
  6. „Übernehmen“ > „SPS is connected“ > OK
  7. TEST: z.B. DB beschreiben

HINWEIS: das IPS-Modul verwendet LIBNODAVE (bitte lesen für weitere Hinweise)

SWF - Film

MST

Ein nützliches Tool beim Schreiben von Skripten in IPS ist: „Befehl hinzufügen“
Es hilft das richtige anzusprechende Gerät zu finden, liefert (filtert) gerätespezifische Befehle und sorgt für die richtige Syntax.
So wird es gemacht:

  1. ein neues Skript hinzufügen (hier „Lampe an“)
  2. in der gewünschten Zeile den Cursor positionieren
  3. „Befehl hinzufügen“
  4. „Auswählen“
  5. Doppelklick auf ID des betreffenden Gerätes (hier HomeMatic Aktor)
  6. die Funktion auswählen
  7. „Parameter“ & „Wert“ eingeben (hier „STATE“ und „TRUE“ weil der Aktor eingeschaltet werden soll)
  8. „Weiter“ & „OK“
  9. fertig - mit „Ausführen“ kann des Skript getestet werden
    SWF - Film

MST

Hinweis: nach Ausführen des Skriptes wird hier als Warnung: " -1 " ausgegeben.
Dies ist kein Skriptfehler, sondern deutet auf eine gestörte Funkverbindung hin.
Wie diese behandelt werden kann wird u.a. hier erklärt.

Das folgende Beispiel zeigt wie man ohne eine einzige Zeile zu programmieren! beliebige Variablen im Funk-Display anzeigen kann.
Ein Ändern von Variablen z.B. zur Heizungsregelung bzw. ein Ausführen von Skripten z.B. von Szenarien für die Lichtsteuerung ist ebenfalls problemlos möglich.

Teil I

  1. „Instanz erstellen“
  2. „Hersteller"auswählen“ > hier „IP-Symcon / ProJet“
  3. „Gerät“ auswählen > hier „FD-868“
  4. ggf. Name ändern z.B. „Wärmepumpe“
  5. Geräte ID vergeben > hier „1“
  6. OK
  7. TEST: ‚UP‘, ‚DOWN‘, ‚RETURN‘ Tasten drücken

SWF - Film

Teil II

  1. „Instanz erstellen“
  2. „Skript"auswählen“ > hier „IPS-Magic“ :loveips:

<?

if (IPS_SemaphoreEnter($_IPS['SELF']."Handler", 1000))
{
    $instanceID = IPS_GetParent($_IPS['SELF']);
    $keyUpID = IPS_GetObjectIDByName("Schlüsselwert 1",$instanceID);
    $keyDownID = IPS_GetObjectIDByName("Schlüsselwert 2",$instanceID);
    $keyEnterID = IPS_GetObjectIDByName("Schlüsselwert 3",$instanceID);

    IPS_SetHidden($_IPS['SELF'], true);

    $categoryID = @IPS_GetCategoryIDByName("Objects", $_IPS['SELF']);
    if ($categoryID === false)
    {
        $categoryID = IPS_CreateCategory();
        IPS_SetName($categoryID, "Objects");
        IPS_SetParent($categoryID, $_IPS['SELF']);
    }

    $variableEventID = @IPS_GetEventIDByName("Variable Event", $_IPS['SELF']);
    if ($variableEventID === false)
    {
        $variableEventID = IPS_CreateEvent(0);
        IPS_SetName($variableEventID, "Variable Event");
        IPS_SetParent($variableEventID, $_IPS['SELF']);
        IPS_SetEventActive($variableEventID, true);
    }

    if (@IPS_GetEventIDByName("Key Up Event", $_IPS['SELF']) === false)
    {
        $eventID = IPS_CreateEvent(0);
        IPS_SetName($eventID, "Key Up Event");
        IPS_SetParent($eventID, $_IPS['SELF']);
        IPS_SetEventTrigger($eventID, 0, $keyUpID);
        IPS_SetEventActive($eventID, true);
    }

    if (@IPS_GetEventIDByName("Key Down Event", $_IPS['SELF']) === false)
    {
        $eventID = IPS_CreateEvent(0);
        IPS_SetName($eventID, "Key Down Event");
        IPS_SetParent($eventID, $_IPS['SELF']);
        IPS_SetEventTrigger($eventID, 0, $keyDownID);
        IPS_SetEventActive($eventID, true);
    }

    if (@IPS_GetEventIDByName("Key Enter Event", $_IPS['SELF']) === false)
    {
        $eventID = IPS_CreateEvent(0);
        IPS_SetName($eventID, "Key Enter Event");
        IPS_SetParent($eventID, $_IPS['SELF']);
        IPS_SetEventTrigger($eventID, 0, $keyEnterID);
        IPS_SetEventActive($eventID, true);
     }

    $objectNumberID = CreateVariableByName($_IPS['SELF'], "Object Number", 1, "");
    $activeRowID = CreateVariableByName($_IPS['SELF'], "Row Number", 1, "");
    $tempValueID = CreateVariableByName($_IPS['SELF'], "Temporary Value", 2, "");

    $objectIDs = IPS_GetChildrenIDs($categoryID);

    if (count($objectIDs) == 0)
    {
        PJ_LCDText($instanceID, 1, "Objektkategorie");
        PJ_LCDText($instanceID, 2, "ist leer!");
    }
    else
    {
        $objects = array();
        foreach ($objectIDs as $id)
        {
            $obj = getObject($id);
            if ($obj['ObjectType'] == 2 || $obj['ObjectType'] == 3)
            {
                $objects[] = $obj;
            }
        }
        usort($objects, "compareObjects");

        $activeRow = GetValueInteger($activeRowID);
        switchObject(max(0, min(count($objectIDs) - 1, GetValueInteger($objectNumberID))));

        if ($_IPS['SENDER'] == "Variable")
        {
            if ($_IPS['VARIABLE'] == $keyUpID)
            {
                if ($activeRow == 0 && $objectNumber > 0)
                {
                    switchObject($objectNumber - 1);
                }
                else if ($activeRow == 1)
                {
                    if ($variable["VariableType"] == 0)
                    {
                        $tempValue = 0;
                    }
                    else if ($variable["VariableType"] == 1 || $variable["VariableType"] == 2)
                    {
                        if (count($variable["VariableProfile"]["Associations"]) > 0)
                        {
                            for ($i = count($variable["VariableProfile"]["Associations"]) - 1; $i >= 0; $i--)
                            {
                                $association = $variable["VariableProfile"]["Associations"][$i];
                                if ($tempValue > $association["Value"])
                                {
                                    $tempValue = $association["Value"];
                                    break;
                                }
                            }
                        }
                        else
                        {
                            $tempValue = max($variable["VariableProfile"]["MinValue"], $tempValue - $variable["VariableProfile"]["StepSize"]);
                        }
                    }
                    $variable["VariableValue"] = $tempValue;
                }
            }
            else if ($_IPS['VARIABLE'] == $keyDownID)
            {
                if ($activeRow == 0 && $objectNumber + 1 < count($objectIDs))
                {
                    switchObject($objectNumber + 1);
                }
                else if ($activeRow == 1)
                {
                    if ($variable["VariableType"] == 0)
                    {
                        $tempValue = 1;
                    }
                    else if ($variable["VariableType"] == 1 || $variable["VariableType"] == 2)
                    {
                        if (count($variable["VariableProfile"]["Associations"]) > 0)
                        {
                            for ($i = 0; $i < count($variable["VariableProfile"]["Associations"]); $i++)
                            {
                                $association = $variable["VariableProfile"]["Associations"][$i];
                                if ($tempValue < $association["Value"])
                                {
                                    $tempValue = $association["Value"];
                                    break;
                                }
                            }
                        }
                        else
                        {
                            $tempValue = min($variable["VariableProfile"]["MaxValue"], $tempValue + $variable["VariableProfile"]["StepSize"]);
                        }
                    }
                    $variable["VariableValue"] = $tempValue;
                }
            }
            else if ($_IPS['VARIABLE'] == $keyEnterID)
            {
					if ($variable != null)
                {
                    if ($activeRow == 0 && $hasAction)
                    {
                        $activeRow = 1;
                    }
                    else if ($activeRow == 1)
                    {
                        if ($tempValue != $variable['VariableValue'])
                        {
                            if ($variable["VariableCustomAction"] > 0)
                            {
                                $vars = array();
                                $vars['IPS_SENDER'] = "ViewJet";
                                $vars['IPS_VARIABLE'] = $object['RealObjectID'];
                                $vars['IPS_VALUE'] = (double)$tempValue;
                                $vars['IPS_INSTANCE'] = $instanceID;
                                if ($object['RealObjectID'] != $object['ObjectID']) { $vars['IPS_LINK'] = $object['ObjectID']; }

                                IPS_RunScriptEx(getLinkedID($variable["VariableCustomAction"]), $vars);
                            }
                            else
                            {
                                IPS_RequestAction(IPS_GetParent($object['RealObjectID']), $variable["VariableIdent"], (double)$tempValue);
                            }

                            PJ_SwitchLED($instanceID, 3, true);
                            IPS_Sleep(250);
                            PJ_SwitchLED($instanceID, 3, false);
                        }
                        $activeRow = 0;
                    }
                }
                else
                {
                    $vars = array();
                    $vars['IPS_SENDER'] = "ViewJet";
                    $vars['IPS_INSTANCE'] = $instanceID;
                    if ($object['RealObjectID'] != $object['ObjectID']) { $vars['IPS_LINK'] = $object['ObjectID']; }

                   IPS_RunScriptEx($object['RealObjectID'], $vars);
     	             PJ_SwitchLED($instanceID, 3, true);
                   IPS_Sleep(550);
                   PJ_SwitchLED($instanceID, 3, false);
                }
            }
        }

        $hasPreviousValue = ($tempValue > $variable['VariableProfile']['MinValue']);
        $hasNextValue = ($tempValue < $variable['VariableProfile']['MaxValue']);

        if (count($variable['VariableProfile']['Associations']) > 0)
        {
            $hasPreviousValue = $tempValue > $variable['VariableProfile']['Associations'][0]['Value'];
            $hasNextValue = $tempValue < $variable['VariableProfile']['Associations'][count($variable['VariableProfile']['Associations']) - 1]['Value'];
        }

        $titleLeft = ($objectNumber < 1) ? " " : (($activeRow == 0) ? chr(127) : "<");
        $titleRight = ($objectNumber + 1 >= count($objectIDs)) ? " " : (($activeRow == 0) ? chr(126) : ">");
        $title = $titleLeft.formatText($object["ObjectName"]).$titleRight;

        $text = "";
        if ($object['ObjectType'] == 2)
        {
            $text = getAssociatedValue($variable, $tempValue);
            $textLeft = (!$hasAction || !$hasPreviousValue) ? " " : (($activeRow == 1) ? chr(127) : "<");
            $textRight = (!$hasAction || !$hasNextValue) ? " " : (($activeRow == 1) ? chr(126) : ">");
            $text = $textLeft.formatText($text).$textRight;
        }
        else
        {
            $text = ">".formatText("ausführen")."<";
        }

        PJ_LCDText($instanceID, 1, $title);
        PJ_LCDText($instanceID, 2, $text);

        SetValueInteger($activeRowID, $activeRow);
        SetValueInteger($objectNumberID, $objectNumber);
        SetValueFloat($tempValueID, (float)$tempValue);
    }

    IPS_SemaphoreLeave($_IPS['SELF']."Handler");
}

function formatText ($text)
{
    $text = str_replace("ß", chr(226), $text);
    $text = str_replace("°", chr(223), $text);
    $text = str_replace("ä", chr(225), $text);
    $text = str_replace("ö", chr(239), $text);
    $text = str_replace("ü", chr(245), $text);
    return sprintf("%-14.14s", sprintf("%".(7 + floor(strlen($text) / 2))."s", $text));
}

function getIPSVariable ($id)
{
    $variableID = $id;
    $linkedVariableID = getLinkedID($variableID);
    $variable = IPS_GetVariable($linkedVariableID);
    $variable['VariableType'] = $variable['VariableValue']['ValueType'];
    $variable['VariableValue'] = GetValue($linkedVariableID);
    $variable['ObjectName'] = IPS_GetName($variableID);
    $variable['VariableHasAction'] = false;
    $variable['IsStatusVariable'] = false;
    $variable['VariableInstanceID'] = 0;
    $variable['VariableIdent'] = "";

    $profileName = IPS_VariableProfileExists($variable['VariableProfile']) ? $variable['VariableProfile'] : "";
    if (strlen($variable['VariableCustomProfile']) > 0 && IPS_VariableProfileExists($variable['VariableCustomProfile']))
    {
        $profileName = $variable['VariableCustomProfile'];
    }

    $variable['VariableProfile'] = array();

    if (strlen($profileName) > 0)
    {
        $variableProfile = IPS_GetVariableProfile($profileName);
        $variable['VariableProfile'] = $variableProfile;
        if ($variable['VariableType'] == 0) { $variable['VariableProfile']['MaxValue'] = 1; }
        $variable['VariableHasAction'] = $variable['VariableCustomAction'] > 0;

        $variableParentID = IPS_GetParent($linkedVariableID);
        $variableParent = IPS_GetObject($variableParentID);
        if ($variableParent["ObjectType"] == 1)
        {
            $statusVariableIdents = IPS_GetChildrenIDs($variableParentID);
            foreach ($statusVariableIdents as $id)
            {
					 $o = IPS_GetObject($id);
					 if($o['ObjectIdent'] != "") {
	                $linkedVariableID = $id;
	                 $variable['IsStatusVariable'] = true;
	                 $variable['VariableInstanceID'] = $variableParentID;
	                 $variable['VariableIdent'] = $o['ObjectIdent'];
	                 $statusVariable = IPS_GetVariable($id);
	                 $variable['VariableHasAction'] = $variable['VariableAction'] > 0 || $variable['VariableCustomAction'] > 0;
	                 break;
	            }
            }
        }
    }

    return $variable;
}

function getLinkedID ($ObjectID)
{
    if (IPS_ObjectExists($ObjectID))
    {
        $obj = IPS_GetObject($ObjectID);
        if ($obj['ObjectType'] === 6)
        {
            $link = IPS_GetLink($ObjectID);
            $ObjectID = $link['TargetID'];
        }
    }

    return $ObjectID;
}

function getAssociatedValue ($object, $value, $useAssociations = true, $printValue = null)
{
    if ($object["VariableProfile"]["ProfileName"] == "~UnixTimestamp") { return date("d.m.y H:i:s", $value); }

    $printValue = ($printValue === null) ? $value : $printValue;
    $last = null;

    if ($useAssociations)
    {
        foreach ($object["VariableProfile"]["Associations"] as $i)
        {
            if ($value >= $i["Value"])
            {
                if ($i["Name"] !== "")
                {
                    $last = $i;
                }
                else
                {
                    $last = null;
                }
            }
            else
            {
                break;
            }
        }
    }

    if ($last !== null)
    {
        $value = sprintf($last["Name"], $printValue);
    }
    else if (!is_string($value))
    {
        if (trim($object["VariableProfile"]["Suffix"]) == "%")
        {
            $value = ($value / ($object["VariableProfile"]["MaxValue"] - $object["VariableProfile"]["MinValue"])) * 100;
        }
        $value = sprintf("%.".$object["VariableProfile"]["Digits"]."f", $value);
    }
    $result = $object["VariableProfile"]["Prefix"].$value.$object["VariableProfile"]["Suffix"];

    return $result;
}

function getObject ($ObjectID)
{
    if (!IPS_ObjectExists($ObjectID)) { return false; }

    $object = IPS_GetObject($ObjectID);

    if ($object['ObjectType'] == 6)
    {
        $link = IPS_GetLink($ObjectID);
        if (!IPS_ObjectExists($link['TargetID'])) { return false; }

        $linkObject = $object;
        $object = IPS_GetObject($link['TargetID']);
        $object['RealObjectID'] = $object['ObjectID'];
        $object['ObjectIcon'] = ($linkObject['ObjectIcon'] != "") ? $linkObject['ObjectIcon'] : $object['ObjectIcon'];
        $object['ObjectID'] = $ObjectID;
        $object['ObjectInfo'] = $linkObject['ObjectInfo'];
        $object['ObjectIsHidden'] = $linkObject['ObjectIsHidden'];
        $object['ObjectName'] = $linkObject['ObjectName'];
        $object['ObjectPosition'] = $linkObject['ObjectPosition'];
        $object['ParentID'] = $linkObject['ParentID'];
    }
    else
    {
        $object['RealObjectID'] = $ObjectID;
    }

    return $object;
}

function CreateVariableByName ($id, $name, $type, $profile = "")
{
  //  global $_IPS['SELF'];
    $vid = @IPS_GetVariableIDByName($name, $id);
    if ($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
        if ($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

function compareObjects ($a, $b)
{
    $comp = ($a['ObjectPosition'] < $b['ObjectPosition']) ? -1 : (($a['ObjectPosition'] == $b['ObjectPosition']) ? 0 : 1);
    if ($comp == 0)
    {
        if (isset($a['ObjectType']))
        {
            $comp = ($a['ObjectType'] < $b['ObjectType']) ? -1 : (($a['ObjectType'] == $b['ObjectType']) ? 0 : 1);
        }
        if ($comp == 0)
        {
            $comp = strcmp($a['ObjectName'], $b['ObjectName']);
            if ($comp == 0)
            {
                $comp = $a['ObjectID'] > $b['ObjectID'];
            }
        }
    }
    return $comp;
}

function switchObject ($num)
{
    global $objectNumber, $objects, $object, $variable, $hasAction, $tempValue, $tempValueID, $variableEventID, $activeRow;

    $objectNumber = $num;
    $object = $objects[$objectNumber];

    if ($object['ObjectType'] == 2)
    {
        $variable = getIPSVariable($object['ObjectID']);
        $hasAction = ($variable['VariableType'] < 3) && $variable['VariableHasAction'];
        $tempValue = ($activeRow == 0) ? $variable["VariableValue"] : GetValue($tempValueID);
        IPS_SetEventTrigger($variableEventID, 1, getLinkedID($object['ObjectID']));
        IPS_SetEventActive($variableEventID, true);
    }
    else
    {
        $variable = null;
        $hasAction = true;
        $tempValue = 0;
        IPS_SetEventActive($variableEventID, false);
    }
}

?>

  1. einmal ‚Ausführen‘
  2. schließen mit ‚X‘

SWF - Film

Teil III

  1. gewünschte Variablen (hier einer Wärmepumpe) und Skripte unter 'Objects" als 'Link" hinzufügen
  2. fertig

SWF - Film

Teil IV
… und nun noch bei Bedaf die ‚Objekte einsortieren‘
Ich verwende 10er Schritte für den Fall, dass später etwas dazwischen soll

Teil V
Das Ergebnis auf den Display

MST

Das folgende Beispiel zeigt wie man ohne eine einzige Zeile zu programmieren! einen Zahlenwert einer Variable automatisch umrechnet und einer anderen Variable zuweist (z.B kW in Watt umrechnen - also durch 1000 teilen).

  1. eine neue ‚Variable‘ hinzufügen (hier: Meine kleine Zahl)
  2. der o.g. Variable ein ‚Zyklisches Ereignis‘ hinzufügen
  3. die bestehende Variable mit ‚Bei Variablenänderung‘ auswählen
  4. Code aus ‚Vorlage‘ auswählen und ggf. ändern (hier durch 1000 teilen)
  5. fertig

Bei jeder Wertänderung der Ursprungsvariable wird die neue Variable entsprechend umgerechnet.
Selbstverständlich können auch andere Ereignisse ausgeführt werden wie z.B. ‚Skript starten‘ oder ‚Gerät ausführen‘

SWF - Film

MST

Das folgende Beispiel zeigt wie man einen Aktor zu bestimmten Zeiten schalten kann
ohne ein eigenes Skript zu verwenden, dass den Schaltbefehl enthält.
(hier wird eine Wärme-Pumpe über ein Hilfs-Relais (um 22:00 Uhr ausgeschaltet.
Das Relais ist wiederum an einen HomeMatic-Aktor verbunden)

  1. die gewünschte Instanz auswählen (hier: HomeMatic Device)
  2. ein "Neues zyklisches Ereignis’ hinzufügen
  3. Datumsmuster / Zeit eintragen
  4. gewünschte Funktion eingeben (hier: HM_WriteValueBoolean($IPS_TARGET, „STATE“ , false);
  5. fertig

SWF - Film

MST

Das folgende Beispiel zeigt wie man Gruppenadressen aus einer ESF-Datei importiert.

  1. In der ‚Willkommen‘ Ansicht einen neuen ‚KNX/EIB Configurator‘ hinzufügen
  2. Über den Button ‚OPC Export hochladen‘ die gewünschte ESF-Datei auswählen
  3. Einzelne oder alle Aktoren auswählen.
    Mit ‚Erstellen‘ werden sie in IP-Symcon übernommen und bekommen somit eine 5-stellige ID zugewiesen.
  4. Zusätzlich kann man unter ‚Konfigurieren‘ sich die Adresse oder Funktion ansehen.
    Mit Hilfe des ‚Test Center‘ können Schaltvorgänge direkt ausführen werden.
  5. fertig

SWF - Film

MST