IP-Symcon 2.5/2.6 - Hilfsskripte

Da einige Funktionen zur 3.0 wegfallen werden, könnte ihr mit diesem Skript überprüfen in wie fern ihr betroffen seid. Es werden auch direkt Tipps gegeben, wie man diesen Missstand beheben kann, bzw. mit welcher Funktion es ersetzt werden soll. Ausnahme: Wenn die SetValue*/GetValue* Funktionen mit einer Variable ( z.B. $id = „Variablenname“; GetValue*($id); ) benutzt werden, dann findet das Skript dieses „Problem“ nicht. Das eilt nicht und ist zur 2.5 nicht erforderlich. Jedoch wird es zur 3.0 notwendig sein.


<?

$search = Array(
    'SetValueBoolean("',
    'SetValueInteger("',
    'SetValueFloat("',
    'SetValueString("',
    'GetValueBoolean("',
    'GetValueInteger("',
    'GetValueFloat("',
    'GetValueString("',
    'IPS_SetScriptTimer("',
    'IPS_GetScriptTimer("',
    'IPS_RunScript("',
    'IPS_RunScriptEx("',
    'IPS_RunScriptWait("',
    'IPS_RunScriptWaitEx("',
);
$replace_m = Array(
    Array('IPS_GetVariableID(', 'IPS_GetVariableIDByName'),
    Array('IPS_GetScriptID(', 'IPS_GetScriptIDByName'),
);
$replace_o = Array(
    Array('IPS_StatusVariableExists(', '@IPS_GetObjectIDByIdent'),
    Array('IPS_GetStatusVariable(', 'IPS_GetObjectIDByIdent und IPS_GetVariable (VariableAction)'),
    Array('IPS_GetStatusVariableID(', 'IPS_GetObjectIDByIdent (+ Parameter tauschen)'),
    Array('IPS_GetStatusVariableIdents(', 'IPS_GetChildrenIDs und IPS_GetObject (ObjectIdent)'),
    Array('IPS_SetStatusVariableUseAction(', '#TODO#'),
);

$scriptids = IPS_GetScriptList();
$found = false;
foreach($scriptids as $id)
{
    if($id != $IPS_SELF)
    {
        $script = IPS_GetScript($id);
        $data = file_get_contents(IPS_GetKernelDir()."/scripts/".$script['ScriptFile']);
        foreach($search as $p)
        {
            if(!(strpos($data, $p) === false)) {
                    $found = true;
                $p = substr($p, 0, strpos($p, "("));
                echo "Skript: ".IPS_GetName($id)." #".$id.", Funktion: ".$p.", Bitte statt dem Namen die ID der Variable eintragen
";
            }
        }
        foreach($replace_m as $p)
        {
            if(!(strpos($data, $p[0]) === false)) {
                    $found = true;
                $p[0] = substr($p[0], 0, strpos($p[0], "("));
                echo "Skript: ".IPS_GetName($id)." #".$id.", Funktion: ".$p[0].", Diese Funktion mit ".$p[1]." ersetzen
";
            }
        }
        foreach($replace_o as $p)
        {
            if(!(strpos($data, $p[0]) === false)) {
                    $found = true;
                $p[0] = substr($p[0], 0, strpos($p[0], "("));
                echo "Skript: ".IPS_GetName($id)." #".$id.", Funktion: ".$p[0].", Diese Funktion mit ".$p[1]." ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt
";
            }
        }
    }
}
if(!$found)
{
    echo "
Es sind keine Änderungen erforderlich. Viel Spaß mit IP-Symcon 2.5!";
}
else
{
    echo "
Bitte führen Sie die angezeigte(n) Änderung(en) durch. Es kommt ansonsten zu Fehlermeldungen!";
}

?>

hallo paresy,
das würde zb. das script von horst für den viewjet betreffen.
evtl. könntest du ja mal ein update zeigen, wie das dann auszusehen hat bei 3.0

Ich bekomme folgende Meldungen betreffend der Heizungs-Skripte und habe null Ahnung wie ich das beheben kann. :confused:

Was ist gemeint mit „(+ Parameter tauschen)“?

Ich bekomme gerade wieder leichte Panik-Attacken … :eek:

Auch laufen einige Fritz!Box Skripte nicht mehr und die „neuen“ kann ich so einfach nicht in den bestehenden austauschen.

Wann kommt denn die 3.0? Ich bin erst mal zurück zur 2.4 …

Wäre für jeden Tipp dankbar … :loveips:

Skript: Set_Solltemperatur #33926, Funktion: IPS_GetStatusVariableID, Diese Funktion mit IPS_GetObjectIDByIdent (+ Parameter tauschen) ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt
Skript: Set_Modus #48179, Funktion: IPS_GetStatusVariableID, Diese Funktion mit IPS_GetObjectIDByIdent (+ Parameter tauschen) ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt
Skript: Set_Modus #48179, Funktion: IPS_GetStatusVariableIdents, Diese Funktion mit IPS_GetChildrenIDs und IPS_GetObject (ObjectIdent) ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt
Skript: Set_Modus #53756, Funktion: IPS_GetStatusVariableID, Diese Funktion mit IPS_GetObjectIDByIdent (+ Parameter tauschen) ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt
Skript: Set_Modus #53756, Funktion: IPS_GetStatusVariableIdents, Diese Funktion mit IPS_GetChildrenIDs und IPS_GetObject (ObjectIdent) ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt
Skript: Set_Solltemperatur #34200, Funktion: IPS_GetStatusVariableID, Diese Funktion mit IPS_GetObjectIDByIdent (+ Parameter tauschen) ersetzen. Optional. Diese Funktion wird erst zur 3.0 entfernt

Vorher (2.4):

$vid = @IPS_GetStatusVariableID($iid, „LastMessage“);

Nachher (2.5)

$vid = @IPS_GetObjectIDByIdent(„LastMessage“, $iid);

Die Reihenfolge der Parameter wurde umgedreht bzw. getauscht

Danke BestEX, das hab ich jetzt soweit verstanden. Hast du auch ein so gut verständliches Beispiel für die 2. Veränderung ?

IPS_GetStatusVariableIdents, Diese Funktion mit IPS_GetChildrenIDs und IPS_GetObject (ObjectIdent) ersetzen.

Alt (2.4)

$Name = IPS_GetStatusVariableIdents($id);

Soweit ich das verstanden haben ist hier $Name eine Array mit strings (Alle Variablen Namen unterhalb eines Objects)

Neu (2.5)

$temp = IPS_GetObject($id);

$Name = IPS_GetName($temp[‚ChildrenIDs‘][0]);

Hier ist $temp ein Array mit ID´s (Alle ID´s der Variablen unterhalb eines Objects) die dann mit IPS_GetName in strings gewandelt werden

Ich hoffe meine Vermutung stimmt, mein Programm http://www.ip-symcon.de/forum/f18/homematic-stati-ueberpruefen-2-5-a-16627/

zumindest funktioniert

Danke BestEx,

das werde ich die Tage ausprobieren und berichten.
Wenn das funktioniert, hätte ich zumindest die mir wichtigen FHT Skripte wieder am Laufen … blieben dann noch die Fritz!Box Skripte und ein paar Kleinigkeiten anzupassen.

Mit deiner Hilfe bin ich aber schon mal einen ganzen Schritt weiter. Nochmals Danke !

Hallo,

ich habe auch ein Problem beim Überführen des Befehls „IPS_GetVariableID“ nach „IPS_GetVariableIDByName“ .

Der originale Befehlsfetzen lautet:


$varID = @IPS_GetVariableID("@UVR1611_02 Zeitzähler (Output".$i.")");
$val = GetValue($varID);

Der von mir geänderte lautet:

$varID = @IPS_GetVariableIDByName("@UVR1611_02 Zeitzähler (Output".$i.")", $ParentID);
$val = GetValue($varID);

Dann bekomme ich eine Warnung:

Warning:  Variable #0 existiert nicht in C:\IP-Symcon\Scripts\46768.ips.php on line 69

Was ist falsch??? Wie muss ich die „ParentID“ angeben wenn ich im kompletten Baum suchen möchte???

Gruß Proxima

Ich würde über die Ident gehen. Das ganze ist inclusive Array hier beschrieben : IPS_GetObjectIDByIdent: IP-Symcon :: Automatisierungssoftware

Wer wissen möchte, wieviele Scripts noch zuändern sind, einfach ausführen.

<?
$search = Array('$IPS_SENDER', '$IPS_SELF', '$IPS_VALUE', '$IPS_VARIABLE', '$IPS_INSTANCE',
                      '$IPS_EVENT', '$IPS_TRIGGER', '$IPS_OLDVALUE', '$IPS_TARGET', '$IPS_LINK',
                     '$IPS_REMOTE_ADDR', '$IPS_DIRECTION', '$IPS_DURATION', '$IPS_COMPONENT',
                     '$IPS_REMOTE_HOST', '$IPS_STATUS', '$IPS_STATUSTEXT' );

$scriptIDs = IPS_GetScriptList();
$found = false;
$anzahl = 0;

foreach($scriptIDs as $id)
{
    if($id != $IPS_SELF)
   {
       $script = IPS_GetScript($id);
      $data = file_get_contents(IPS_GetKernelDir()."/scripts/".$script['ScriptFile']);
      foreach($search as $befehl)
      {
         if(!(strpos($data, $befehl) === false))
            {
            $found = true;
            $anzahl++;
            echo "Script: ".IPS_GetName($id)." #".$id.", Systemvariable: ".$befehl.", gefunden.
";
         }
      }
    }
}
echo "\rEs sind noch ".$anzahl." Änderungen zu machen!";
?>

…und das kann einen ganz schön erschrecken…:eek: :eek:

Hallo!

Habe das Script ausgeführt, das wird z.B. gefunden:
Script: wecker #23605, Systemvariable: $IPS_SENDER, gefunden.
Script: wecker #23605, Systemvariable: $IPS_SELF, gefunden.
Script: wecker #23605, Systemvariable: $IPS_VALUE, gefunden.

Davon habe ich viele Meldungen.
Was will mir dieses Sagen?:o

Gibt es das nicht mehr?
$IPS_SENDER usw…

Schönen Gruß:)
Egon

Wie wäre es damit?

Oder hier

Die $IPS_* nach $_IPS[li] zu ändern würde ich fürs erste nicht machen. Dafür werde ich mal bei Zeiten ein Skript schreiben, sodass es automatisiert passiert.
[/li]
Jedoch würde ich es in neuen Skripten direkt mit $_IPS verwenden. :slight_smile:

paresy

so, von meinen 33 Änderungen sind nur noch 9 übrig und die verstecken sich in Funktionen zB:

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;
}

die habe ich erstmal stehen gelassen, weil das geht nicht ohne Fehlermeldungen.

Da diese Funktion öfter vorkommt, könnte man sowas nicht einfach includen ?

IPS_SetInfo($vid, "This Variable was created by Script #".$_IPS['SELF']);

Die global Zeile muss weg. $_IPS ist per definition von sich aus global :wink:

paresy

so, hat bestens geklappt, alles ersetzt und es funzt auch alles.
bei der gelegenheit verschiedene funktionen durch include ersetzt.
der erste weg zur schlanken strukturierung :smiley:

Ich hab nun auch die gröbsten Fehler behoben (bin schon bei noch 39 Änderungen angelangt :-)), allerdings kommen bei mir auch in der 2.5 schon Fehlermeldungen bei $IPS_SELF etc.
auch die Testscripte funktionieren erst nach Änderung in $_IPS[‚SELF‘]
bzw. bringen sonst zig mal den Fehler im eigenen Script.
Sollte das nicht erst ab 3.0 so sein?
Vielen Dank an RWN, dein Script spart wirklich viel Zeit, ich werd die Änderungen jetzt durchziehen, dann ist der Schock bei Umstieg auf 3.0 hoffentlich nicht mehr so groß wie dieses mal :wink:
Vor allem die ganzen Action Scripte gingen alle nicht mehr, aber mit deinem tool gehts wirklich flott.

Sieh mal in deinem Scripts-Ordner ob da keine _autoinclude.inc.php vorhanden ist. Die Scripts sollten sowohl mit den alten wie auch den neuen Befehlen gehen.