Nach man. Anpassungen automatisch erzeugter Variablen werden diese nicht mehr erkannt

Guten Morgen zusammen,

ich habe das Skript für die Integration des Miele@home Skriptes angepasst. Es läuft bis auf die Verwendung von IPS_GetObjectIDByIdent (siehe auch hier: Miele Hausgeräte mit Miele@Home 2.0 (ZigBee) nachrüsten - Erfahrungen - Seite 7 ) prima.

Was mich irritiert ist aber, dass nach Anpassungen der automatisch erzeugten Variablen, explizit eine mit Umlaut („Gerät“) folgendes zu Beobachten ist:

  • das Sktipt lief initial, alle Variablen sind über das Auslesen der XML Datei erzeugt.
  • der Skripttimer der die Variablen updated ist angehalten
  • ich bearbeite die Variable „Gerät“, weise Ihr dabei ein Icon zu und speichere
  • ich aktiviere den Skripttimer wieder
  • die bearbeitete Variable wird nicht mehr identifiziert, das Skript legt eine neue, gleichnamige Variable an
  • vom löschen der neuen Variable und rücksetzen der Initialen lässt sich das Skript nicht beirren. Es findet die ursprüngliche Variable nicht mehr und legt wieder eine Neue an.

Ist das in anderen Fällen reproduzierbar oder kann mir bitte jemand auf die Sprünge helfen?

Besten Dank,

Frank

Hier das Skript:

 <?

    // **************************************************************************
    // Eingabedaten
   // **************************************************************************

    $IPAdresse = "192.168.005.027";         //IP-Adresse XGW300 Gateway.
    $Passwort = "xgw3000";              //Passwort für die Homebus anmeldung. Standard ist "xgw3000".

	// 20160228 diese Version ist getestet unter IPS 4.0 beta aktueller Stand, XGW3000 aktuelle Firmware mit einem Trockner und einer Waschmaschine

   // **************************************************************************
   // **************************************************************************

    // Username für die Homebus Anmeldung
    $Username = "xgw3000";

    // ID des Übergeordneten Objekts ermittlen (ID der Kategorie)
//       $ParentID = IPS_GetParent($IPS_SELF); //vor IPS v 4.0
    $ParentID = IPS_GetParent($_IPS['SELF']);

    // Allgemeine Gerätedaten vom Gateway abfragen
   $content = @Sys_GetURLContentEx('http://' . $IPAdresse . '/homebus', Array("AuthUser"=> $Username, "AuthPass"=> $Passwort));
   if ($content == false) {
      return;
   }

   // Empfangene XML-Struktur laden
   $devices=simplexml_load_string($content);

   // Alle gefundenen Geräte durchgehen
   foreach($devices as $device)
   {
      // Allgemeine Daten parsen
      $device_uid = str_replace("-", "N", $device->UID);
      $device_name = utf8_decode($device->name);
      $device_type = utf8_decode($device->type);
      $device_additionalname= utf8_decode($device->additionalName);
      $device_url = $device->actions->action->attributes()['URL'];

      // Dummy Instance ID ermitteln, wenn nicht vorhanden, dann erstellen
        $DeviceID = GetInstID($ParentID, $device_uid, $device_additionalname);

      // Dummy Instance Name aktualisieren, wenn unterschiedlich
      if (IPS_GetName($DeviceID) != $device_additionalname)
      {
         IPS_SetName($DeviceID, $device_additionalname);
      }

      // VariablenID ermitteln, wenn nicht vorhanden, dann erstellen
      $VarID = GetVarID($DeviceID, 'Typ', 'Gerätetyp');

      // Variablenwert aktualisieren, wenn unterschiedlich
      if (GetValueString($VarID) != $device_type)
      {
         SetValueString($VarID, $device_type);
      }

      // Gerätedetails abfragen
      $content = @Sys_GetURLContentEx(strval($device_url), Array("AuthUser"=> $Username, "AuthPass"=> $Passwort));
       if ($content == false) {
          return;
       }

      // Empfangene XML-Struktur laden
      $device=simplexml_load_string($content);
      $keys = $device->information;

      // Alle Werte durchgehen
      foreach($keys->children() as $key)
      {
         // VariablenID ermitteln, wenn nicht vorhanden, dann erstellen
//       $VarID=GetVarID($DeviceID, filter_characters(utf8_decode($key['name']))); //vor IPS v 4.0
         $VarID=GetVarID($DeviceID, utf8_decode($key['name']));

         // Variablenwert aktualisieren, wenn unterschiedlich
         if (GetValueString($VarID) != utf8_decode($key['value']))
         {
            SetValueString($VarID, utf8_decode($key['value']));
         }
      }
   }

   //Script Timer prüfen, wenn nicht vorhande dann mit 10 sec erstellen
   If (IPS_GetScriptTimer($_IPS['SELF']) == 0)
   {
       IPS_SetScriptTimer($_IPS['SELF'], 10);
    }


   // **************************************************************************
   // Hilfsfunktionen
   // **************************************************************************

   // Diese Funktion dient zum Ermitteln einer Variablen-ID anhand des Ident
   // Wenn die Variable nicht existiert, wird sie angelegt
   function GetVarID($parentid, $ident)
   {
//     $varid = @IPS_GetObjectIDByIdent($ident, $parentid); //vor IPS v 4.0
       $varid = @IPS_GetObjectIDByName($ident, $parentid);
      if ($varid === false)
      {
         $ScriptID = $_IPS['SELF'];
            $varid = IPS_CreateVariable(3);
            IPS_SetParent($varid, $parentid);
            IPS_SetIdent($varid, $ident);
            IPS_SetName($varid, $ident);
            IPS_SetInfo($varid, "This Variable was created by Script #$ScriptID");
            IPS_SetVariableCustomProfile($varid, "~String");
      }
      return $varid;
   }


   // Diese Funktion dient zum Ermitteln einer Dummy Instanz-ID anhand des Ident
   // Wenn die Dummy Instanz nicht existiert, wird sie angelegt
   function GetInstID($parentid, $ident, $name)
   {
       $ObjektID = @IPS_GetObjectIDByIdent($ident, $parentid);
      if ($ObjektID === false)
      {
         $ScriptID = $_IPS['SELF'];
            $ObjektID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); //Dummy Instance erstellen
           IPS_SetParent ($ObjektID, $parentid);   // Dummy Instance verschieben
           IPS_SetName ($ObjektID, $name);  //Dummy Instance umbenennen
            IPS_SetInfo ($ObjektID, "This Variable was created by Script #$ScriptID");
            IPS_SetIdent ($ObjektID, $ident);
      }
      return $ObjektID;
   }


   // Funktion zum filtern von nicht erlaubten Zeichen (z.B. bei Variablennamen) vor IPS v 4.0 wird zum ermitteln von $VarID nicht mehr benötigt, da Variablennamen jetzt in UTF8 gespeichert werden.
   function filter_characters($input)
   {
       $search = explode(",","ç,æ,,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u,-, ");
      $replace = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u,_,_");
      return str_replace($search, $replace, $input);
   }

?>

Im Ident sollten keine Umlaute und Sonderzeichen genutzt werden.

@ eeFrank: hast du kein Problem mit dem Password in der Codezeile

@Sys_GetURLContentEx('http://' . $IPAdresse . '/homebus', Array("AuthUser"=> $Username, "AuthPass"=> $Passwort)); 

das klappt bei mir in IPS4 nicht. Welches Betriebssystem benutzt du ?