doppelten Archiveintrag löschen

Guten Morgen,

ich hab in meinen Archiveinträgen mehrfach gleich Einträge und würde die gern über ein Script löschen.
Folgende Konfigutation:
Bei Bewegungserkennung im Flur wird in eine Stringvariable der Zeitstempel eingetragen (hier ein Dank an Marcel). An diesem String ist auch das Logging aktiviert. Was auch bis dahin alles gut funktioniert. Nur jedesmal wenn ich das IPS neustarte (für ein Backup oder PC Neustart) wird, obwohl sich der Wert der Variable nicht ändert, ein neuer Eintrag ins Archiv eingefügt, mit dem gleichen Inhalt.
01.jpg
Hat jemand ein Scriptvorschlag für mich, wie ich die doppelten Einträge am besten aus dem Archiv lösche.

Vielen Dank schon mal.

PS: Und bitte bitte keine Kommentare wie, benutz doch die Suchfunktion oder lese mal die Bedienungsanleitung / Handbuch. Ich hab es halt nicht gefunden.

Gruß
Ede

Keiner einen Scriptvorschlag für mich, wie ich die doppelten Einträge am besten aus dem Archiv lösche???:confused:

Du kannst AC_DeleteVariableData nutzen. Damit kannst du Werte für eine Zeitspanne löschen. Die Zeitstempel musst du vorher entsprechend selber raussuchen.

paresy

Ok. Danke.
Werds versuchen es in einem Script nieder zuschreiben.

Alternativ legst du dir eine weitere Variable an und kopierst den Wert nur bei Änderung. Dann musst du erst garnicht löschen.

Hmm, blöderweise passiert ja das Phänomen wenn sich der Wert einer (internen) Variable nicht ändert aber man IPS neustartet.

Vielleicht sollten wir uns die Ursache einmal etwas genauer ansehen. Kannst du sie etwas genauer beschreiben? Eventuell lässt sich hier ansetzen.

Achso, das wäre aber dann meiner Meinung nach ein Bug der behoben werden sollte. Dann hilft wirklich nur die Werte durchsuchen und manuell wieder rauslöschen.

Naja. Hier nochmals die Ausgangssituation.

Ich habe zwei interne Variablen. Eine vom Typ Boolean (nennen wir die mal „Var_Bool“) und eine vom Typ String („Var_String“). Bei Variablenänderung der Var_Bool wird ein Script (Dank an Marcel;)) aufgerufen, welches das aktuelle Datum und Uhrzeit ind die Var_String schreibt.

$TimeStamp = date("d.m.Y H:i:s", time());
SetValue ($TimeStampID, $TimeStamp);

Bei der Var_String ist das Looging (Alle Variablenänderungen aufzeichnen) aktiv.
Das alles funktioniert auch (sehe alle Änderungen / Zeitstempel im WebFront) sehr gut.

Das „einzige“ Problem hier ist, dass jedesmal wenn ich IPS neustarte (fahre den Dienst für ein Backup runter oder bei einem PC Neustart) bekomme ich einen neuen Eintrag in der Datenbank. Obwohl der Variableninhalt sich, nach dem Neustart von IPS, nicht geändert hat.

01.jpg

Siehe Bild, es gibt da an diesem Tag 4 Einträge an 4 unterschiedlichen Uhrzeiten (Zeitstempel von IPS) obwohl sich der Variablenwert (mein Zeitstempel, Variablenänderung der Bool Variable) nicht geändert hat.

Gruß
Ede

Jetzt bräuchten wir das Script welches bei Änderung (oder etwa bei Aktualisierung?) ausgeführt wird.
Sowie die Konfig von diesem Ereignis.

Vermutung:
Var_bool wird durch IPS Neustart aktualisiert.
Script wird durch Aktualisierung ausgelöst. Var_bool hat sich nicht geändert, also wird der Timestamp der letzten Änderung nochmal in Var_string geschrieben.

Edit: Eventuell auch noch Infos zur HW hinter Var_bool.

Michael

<?
// Zeitstempel in Variable schreiben
    $TriggerID = $_IPS['VARIABLE'];
    $ParentID = IPS_GetParent(IntVal($TriggerID));
 
   $TimeStampID = @IPS_GetObjectIDByName("Event", $ParentID);
   $TimeStamp = date("H:i:s", time());
   $TimeStamp = "letzte Änderung: ".$TimeStamp." - ".$_IPS['VALUE'];
   SetValue ($TimeStampID, $TimeStamp);
   

    $ParentID = @IPS_GetObjectIDByName("Auswahl", $ParentID);
   
    switch ($_IPS['VALUE'])
    {
      case true:
         $TimeStampID = @IPS_GetObjectIDByName("EIN", $ParentID);
         if ($TimeStampID === false)
// Falls Variable nicht vorhanden wird sie erstellt.
         $TimeStampID = IPS_CreateVariable(3);
         IPS_SetName($TimeStampID,"EIN");
         IPS_SetParent($TimeStampID, $ParentID);
          $TimeStamp = date("d.m.Y H:i:s", time());
            SetValue ($TimeStampID, $TimeStamp);
            //IPS_SetVariableCustomProfile($TimeStampID,"");
            break;

      case false:
          $TimeStampID = @IPS_GetObjectIDByName("AUS", $ParentID);
         if ($TimeStampID === false)
// Falls Variable nicht vorhanden wird sie erstellt.
         $TimeStampID = IPS_CreateVariable(3);
         IPS_SetName($TimeStampID,"AUS");
         IPS_SetParent($TimeStampID, $ParentID);
              $TimeStamp = date("d.m.Y H:i:s", time());
            SetValue ($TimeStampID, $TimeStamp);
            //IPS_SetVariableCustomProfile($TimeStampID,"");
            break;
      }

?>

Versteh’ ich nicht wirklich :eek:

Zumal das Script ja auch nicht den Timestamp von der IPS-Variable verwendet (also VariableChanged oder VariableUpdated), sondern selbst erzeugt.

Leider hast du hinten die Uhrzeiten abgeschnitten, wäre mal intressant ob das Script überhaupt zum Zeitpunkt des IPS- Neustarts ausgeführt wurde.

Wenn ja, sollte aber bei EIN oder AUS die Uhrzeit vom Neustart eingetragen sein.
Wenn nein, kann es ja nur noch an dem Archive-Control von IPS liegen.

Oder jemand noch eine Idee ?
Michael

Hoffe das hilft.

Ok. Also wird das Skript nur gestartet, wenn sich die Variable ‚Auswahl‘ ändert. wohl eher unwahrscheinlich, dass das beim Systemstart passiert.
Ändern sich denn beim Systemstart die Zeitstempel der Aus und Ein Variablen? Wenn dem nicht so ist, dann vermute ich eher ein IPS Problem beim Logging von Stringvariablen …

Nein, der zustand ändert sich nicht. Sieht man auch ganz rechts an der Uhrzeit.

Habe eben mal bei mir stichprobenartig nachgesehen.

Ich vermute mal alle Variablen werden beim starten einmalig in die DB geschrieben.

Habe leider nicht so viele Variablen, mit welchen ich das prüfen kann.
Entweder werden sie bewußt beim neustart von IPS an der HW angefragt und dann natürlich geloggt, oder sie ändern sich eh alle x Minuten von sich aus.

So bei 5 Variablen welche sich nur alle paar Tage oder Wochen ändern, ist immer ein Eintrag in der DB zum Zeitpunkt des Neustarts.

Vermute mal das ist Absicht.

Stört es denn überhaupt ? (Also mich nicht :wink: )
Und vielleicht ist es mit IPS 4 eh erledigt.

Michael

Mich stört es schon. Möchte damit die Bewegungen vor eine Bewegungsmelder loogen. Da ist es blöd wenn es da Einträge gibt die nicht stimmen.
Daher die Idee, nach einem Neustart von IPS die eine DB zu scannen und neuere Einträge mit dem gleichen Variablenwert zu löschen.

Die Einträge (Werte) stimmen doch.
Der geschrieben String ist ja korrekt, wann die letzte Änderung war.
Wann er geloggt wurde ist ja egal, der geloggte Wert selbst gibt doch die Zeit an, wann die Änderung war (sonst würde ja auch das loggen des String kein Sinn machen.)
So etwas in der Auswertung zu filtern sollte eigentlich kein Problem sein.

Michael

Ein Eintrag sollte nur geschrieben werden, wenn eine Variable aktualisiert oder geändert wird. Ist sonst für mich nicht logisch.

Logisch ist es für mich auch nicht. Aber Fakt ist, die letzte Änderung der Variable „Auswahl“ war am 25.09.2015 um 11:05:04 von Zustand Aus nach Ein. Und seitdem nicht mehr. Aber ich habe trotzdem jede Menge einträge im Archiv (und zwar bei jedem Neustart von IPS. Stört euch nicht bei sovielen Neustarts, bin jede Menge Sachen am testen ;)). Z.B. immer um 03:50 Uhr, da mache ich immer ein Backup.


Und diese „unnötigen“ Einträge möchte ich gern per Script löschen. Nur als Anfänger tu ich mich hier noch recht schwer.