Ips_variable

Hallo fleißige Tester,

kann es sein das die Variable „IPS_VARIABLE“ eine andere Funktion oder andere Parameter hat.

Habe die Abfrage in mehreren Skripten und sie funktioniert nicht mehr, bringt aber auch keinen Fehler.

Die Variable enthält in V2 die VariablenID und nicht mehr den Variablen Namen.

paresy

Oh Mann, dass hatte ich fast befürchtet. :eek:

Das macht ja mal richtig Arbeit. :frowning:

Warum? Kannst du ein Beispiel nennen?

Vielleicht habe ich dann einen passenden Tipp.

paresy

OK, scheint evtl doch mit weniger Aufwand zu klappen als ich zuerst gedacht hatte. Habe mich Deiner Funktion

http://www.ip-symcon.de/forum/showpost.php?p=42816&postcount=9

bedient.

Einfacher würde es gehen wenn man die Ort der Variable weglassen könnte, derzeit muss man es ja nach dem Beispiel machen.

GetIDFromLocation("MeinGerät\\MeineVariable");

Oder hast Du vielleicht eine elegantere Möglichkeit?

Hallo Werner,
ich befürchte, um die Pfade, da werden wir nicht herumkommen. Dafür haben wir dann aber die Möglichkeit, Variablen direkt unter „Mutterobjekte“ zu legen, siehe hier am Beispiel eines HMS100TF:

KlimasensorServerraum
±- LowBattery
…±— LowBattery.time
±-Temperature
…±— Temperature.time
±- Moisture
…±— Moisture.time

In den *.time-Variablen habe ich z.B. „Klartext“-Strings mit den Zeitstempeln der letzten Änderung der Muttervariable, um in der Anzeige einen „Stand: 11.11.2011 11:11:22“ zu haben.

Logischerweise gibt es mehrere von diesen Variablen, namensgleich an jedem Sensor. Um die zu unterscheiden braucht man dann den Pfad.

Hier die Verwendung im Script:


function setTs ($var) { // ggf. generieren / füllen der time-Variablen
   $tsVar=IPS_GetUpdatetimeByID($var);

   if ($tsVar>0) {
      $vname = name($var).".time";
      $vpath = IPS_GetLocation($var)."\\".$vname;
      $nvar = id($vpath);
      if ($nvar === 0) {    // wenn Variable fehlt: anlegen
         $nvar = IPS_CreateVariable(3);
         IPS_SetParent($nvar, $var);
         IPS_SetName($nvar, $vname);
      }

      SetValueString($nvar , date("d.m.Y", $tsVar)." ".date("H:i:s", $tsVar) );
   }
}

Das wird dann „onUpdate“ an jeder Variable getriggert.

Die Funktionen „IPS_GetUpdatetimeByID“, „id“ und „name“ liegen in einer Include, da ich die auch ganz gut bei anderen Scripten brauchen kann bzw. werde.

Aus Kompatibilitätsgründen ist da auch gleich eine Function „IPS_GetUpdatetime()“ mit entstanden, die dann nur noch aus einem Einzeiler besteht:


function name($id) {
   $name = "";
   $f = IPS_GetObject($id);
   foreach($f as $key => $val) {
#      echo $key.":".$val."
";
      if ($key == "ObjectName") {
         $name=$val;
      }
   }
   return $name;
}

function id($name) { // [nach paresy, 24.6.08, http://www.ipsymcon.de/forum/showpost.php?p=42816&postcount=9]
   $id=0;
   $names=explode("\\", $name);
   foreach($names as $str) {
      $id=IPS_GetObjectIDByName($str, $id);
      if($id===false) return 0;   // geändert von "false" auf "0", um Variablen-typen-Fehler zu vermeiden
   }
   return $id;
}

function IPS_GetUpdatetimeByID($id) {
   $ts = 0;
   $f = IPS_GetVariable($id);
   foreach($f as $key => $val) {
#      echo $key.":".$val."
";
      if ($key == "VariableUpdated") {
         $ts=$val;
      }
   }
   return $ts;
}

function IPS_GetUpdatetime($name) {
   return IPS_GetUpdatetimeByID(id($name));
}

Gruß Gerd

Hallo gwanjek,

1000 Danke für deine Skripte. Das mit dem Zeitstempel ist keine dumme Idee, werde ich mir auch mal überlegen.

Das id-Skript hatte ich ja bereits von paresy übernommen, hätte mir nur gewünscht das es eine einfachere Lösung gibt.

Nunja. Müssen halt für den Zeitpunkt der Wirkbetriebaufnahme noch ein paar Skripte angepasst werden.

Nochmals Danke.

„ein paar Scripts“ ist gut. Bei mir dümpeln deren so 139 im Script-Verzeichnis von V1. Und nicht etwa Einzeiler, sondern meist ziemlich komplexes Zeugs. Zzgl. so ca. 10 Librarys.

Wird noch lange dauern bis zum Umschalten der Prod-Umgebung…

Ob das nun optimal ist, was ich da vorgeschlagen habe, weiß ich nicht. Ist auch mein erster Wurf, in V2 klarzukommen.

Sicher braucht man für die „Untervariablen“ auch nicht den alten Variablennamen nochmal als Stamm mit in den Namen der Tochtervariablen zu schreiben (dann „time“ statt „Temperature.time“), aber ich hatte mangels der Pfade bisher in V1 meine Variablen auf diesem Wege strukturiert und so letztlich einem Sensor zugeordnet. Das will ich nun natürlich nicht auch noch alles wieder umbauen müssen, dann könnt ich ja gleich alles neu machen…

Bin selber gespannt, was noch so an Vorschlägen kommt :slight_smile:

------- Ergänzung:------------
Übrigens, bzgl. der PHP-Includes lauert hier noch eine dicke Falle, die m.E: so noch nicht bleiben kann. Aber ich habe dort ja einen Lösungsvorschlag gemacht.
-------Ergänzung Ende--------

Nicht so kompliziert. In IPSV2 kann man vieles durch die IDs einfacher Lösen :slight_smile:

Denkt einfach ohne Namen und Pfade. Nennt die Variable direkt „Updated“ und schon ist sie unabhängig und ihr können die Variablen bennen wie ihr wollt.

http://ipsymcon.de/forum/showthread.php?p=42904#post42904

paresy

Hallo paresy,

ich denke wir reden hier von unterschiedlichen Dingen.

Mein Problem sind die bestehende Skripte, in denen habe ich eine Menge $IPS_VARIABLE und die sind halt aus der V1 noch mit den Variablennamen.

Ich hoffte auf eine einfache Möglichkeit diese so zu belassen wie sie sind aber leider wird in der V2 alles nur noch in IDs gehandelt.

Die IDs mögen für einen Neuaufbau schon OK sein, aber wenn man Skripte von der V1 in die V2 migriert ist es doch eine ganze Menge Arbeit alles umzuschreiben, aber wenn ich schon am Schreiben bin dann kann ich gleich die IDs einpflegen.

Habe mich heute auch mit dem Thema $IPS_VARIABLE beschäftigt.

So hat man die alten Namen wieder in $IPS_VARIABLE.


$IPS_VARIABLE = IPS_GetName((int)$IPS_VARIABLE);

Ich möchte allerdings bei aller Kompatibilität zur V1 nicht vergessen das diese Lösungen auch z.B. folgende Risiken bürgen:

[ul]
[li]Namen können mehrfach vergeben sein, im Gegensatz zur ID, diese ist Eindeutig[/li][li]Kompatibilität kann in Zukunft auch wegfallen[/li][/ul]