UpdateTime in extra Variable ablegen (1 Skript - unedlich Variablen)


<?

 //Event auswerten
 if($IPS_SENDER != "Variable")
  return;

 SetValue(CreateVariableIDByName($IPS_VARIABLE, 'Updated', 3), date("d.m.y H:i:s"));

 function CreateVariableIDByName($id, $name, $type)
 {
   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");
   }
   return $vid;
 }

?>

Diese Skript anlegen und ein OnUpdate Ereignis erstellen mit gewünschter Variable.

paresy

anders kann man die UpdateTime nicht mehr ermitteln?
ist das nicht eher ein schritt zurück?
finde das irgendwie umständlich. brauch man immer nochma ne extra variable und noch n ereignis. das war in V1 sauberer mit der GetUpdateTime Funktion

Hallo Roeni,

das Script von paresy macht noch viel mehr.
Um nur den Timestamp zu erhalten reicht dieses:


$timeupdate = IPS_GetVariable(15341  /*[test	estbool]*/); 
echo $timeupdate = $timeupdate[VariableUpdated]; 

Kann man sowas eigentlich irgendwie in einer Zeile lösen?

  $v = IPS_GetVariable($id);
  $Update= $v['VariableUpdated'];

Ich meine, innerhalb einer Funktion die Variable holen und sofort nur den gewünschten Wert aus dem Array schnappen?

Ich habe aus der V1 unheimlich viele Scripte, in denen ich oft Funktionen verwende wie…

if((time()-IPS_GetUpdateTime($Pruefvariable))>$Minuten*60)...

MfG, douglas882

Hallo douglas,

Du brauchst nur die function in dein Script einzufügen, dann müssten dein Script normal funktionieren.


function IPS_GetUpdateTime($id){
  $v = IPS_GetVariable($id);
  $Update= (int) $v['VariableUpdated'];
  return ($Update);
}

PS:Zitat aus dem Manual.

VariableUpdated float Unix-Timestamp, wenn die Variable zuletzt aktualisiert wurde

Sollte der Timestamp nicht als Integer zurückgegeben werden? Wie es time() auch macht?

Gruß

Hallo Attain,

die UpdateTime wird tatsächlich als Float, genauer gesagt als Double abgespeichert.

Das Format ist genau das selbe, das auch von der PHP-Funktion microtime(true) geliefert wird. Die Stellen vor dem Komma sind identisch mit dem Ergebnis von time() (ein UNIX Timestamp). Die Nachkommastelle ist bis etwa in den Millisekundenbereich auswertbar.

Gruß
HJH

Diese Funktion habe ich schon (vorübergehend) in alle Scripte eingefügt. Aber irgendwie will ich es halt schon „gescheit“ machen. Zitat aus der Doku:

Diese Funktionen sollten nur übergangsweise genutzt werden und so schnell wie möglich gegen die neuen, ID basierten Funktionen ausgetauscht werden, um die neuen Möglichkeiten ausnutzen zu können.

Tatsächlich habe ich mir damit gleich selbst ein Bein gestellt: Da manche Scripts von anderen über include… aufgerufen werden, hat IPS das gleich wieder mit einer neuen Fehlermeldung quittiert, weil dann die Funktion zweimal definiert wurde.

Gibt es dafür eine korrekte Schreibweise? z.B.

$Update=Array(GetValue(12345)['VariableUpdated]);

(BITTE NICHT VERWENDEN! Das ist bestimmt total falsch und soll nur als Beispiel dienen!)

MfG, douglas882

@douglas882

Die o.g. Funktion basiert doch auf IDs. Ist also alles OK und besser geht es leider nicht :slight_smile:

(Die Funktion im Manual hat noch ein paar Zeilen extra, um aus dem Namen eine ID zu machen. Das ist quasi das suboptimale. Die Funktion die Attain gepostet hat ist ok. Den cast auf (int) kann man sich ggf. sparen.)

Ansonsten ist das was HJH schreibt genau richtig!

paresy