Medienobjekte nach Neustart von IPS durcheinander

Hallo,

ich mache von meiner Kamera Snapshots und speichere die als Medinobjekt ab, gecached wird das ganze auch noch.

Ich lösche nach einer Variable (maxAnzahl) immer den ältesten Snapshot aus dem Array, das funktioniert auch wunderbar.
Aber wenn ich IPS neustarte, wirft es die Snapshots durcheinander, die Reihenfolge passt nicht mehr.

Ist das ein Problem an meinem Skript? Oder ist das ein Problem von IPS?
Ich hatte früher das Instar Modul von Fonzo, da war es das selbe.

Ich bin auf 6.4 unterwegs.
Vielleicht kann mir jemand weiter helfen.

Das ist mein Skript.

<?php

$Anzahl_Snapshots = GetValueInteger(24200);
$name = "Kamera Einfahrt";
$ident = "InstarEinfahrt";
//Für Instar 9008 FHD
//$Content = file_get_contents("http://Hans:Wurscht@192.168.17.1/tmpfs/snap.jpg");
//Für Instar 9408 FHD WQHD
$Content = file_get_contents("http://192.168.1.1/snap.cgi?chn=11&user=Hans&pwd=Wurscht");
$filename = time();     //Jede Bild mithilfe von Unix Timestamp unterschiedlich bennennen, damit die Bilder krorrekt in IPS WF. bei Neustart zurückgeladen werden 
$picturename ="$filename";
//$picturename ="Snapshot Kamera Einfahrt";
$catid = 50614;
$MediaID = IPS_CreateMedia(1);                                          // Image im MedienPool anlegen
					IPS_SetParent($MediaID, $catid);                    // Medienobjekt einsortieren unter Kategorie $catid                   
					IPS_SetIdent ($MediaID, $ident.time());             // Unix Timestamp als Ident setzen 
					IPS_SetPosition($MediaID, -time());                 // Unix Timestamp invertieren, somit wird der letze Snapshot im Webfront als erster angezeigt 
					IPS_SetMediaCached($MediaID, true);
                    
					// Das Cachen für das Mediaobjekt wird aktiviert.
					// Beim ersten Zugriff wird dieses von der Festplatte ausgelesen
					// und zukünftig nur noch im Arbeitsspeicher verarbeitet.
					$ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."instar".DIRECTORY_SEPARATOR.$picturename.".jpg";  // Image-Datei
					IPS_SetMediaFile($MediaID, $ImageFile, False);      // Image im MedienPool mit Image-Datei verbinden
					$savetime = date('d.m.Y H:i:s');
					IPS_SetName($MediaID, $name."   ".$savetime);     // Medienobjekt benennen
					//IPS_SetName($MediaID, $name." ".$i);              // Medienobjekt benennen
					//IPS_SetInfo ($MediaID, $savetime);
					IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen
					IPS_SendMediaEvent($MediaID); //aktualisieren


//Handling Anzahl der Snapshots 

$Ausgabe_Array = IPS_GetObject($catid);             //Array des Parents einsammeln 
 
print_r ($Ausgabe_Array);                           //Ausgabe zum testen 
$ID = $Ausgabe_Array['ChildrenIDs']['0'];           //ID die gelöscht werden soll ermitteln 
$Anzahl = count($Ausgabe_Array['ChildrenIDs']);     //Ist- Anzahl vom Array Index ermitteln 

//Wenn Arrayindex größer als $Anzahl_Snapshots ist, Index [0] raus löschen 
if ($Anzahl >= $Anzahl_Snapshots)
    {
    IPS_DeleteMedia($ID, true);                     //Index 0 raus löschen
    }
    

print_r ($Anzahl);
//print_r ($ID);
//$ID = 0;

Was genau ist denn durcheinander? Liegt es an der Position? Der an den Bildern? Wie sieht es auf der Festplatte aus? Stimmt da die Reihenfolge?

paresy

Hi paresy,

also es scheint so, dass es auf der Festplatte sowie im Objektbaum von IPS mit der Reihenfolge passt.
Das Durcheinander habe ich im Array von $Ausgabe_Array = IPS_GetObject($catid); //Array des Parents einsammeln
Hier stimmt alles bis ein Neustart von IPS durchgeführt wird.

Hier ein print_r vom Array

Array
(
    [ParentID] => 10268
    [ObjectID] => 50614
    [ObjectType] => 0
    [ObjectIdent] => 
    [ObjectName] => Snapshots
    [ObjectInfo] => 
    [ObjectIcon] => Camera
    [ObjectSummary] => 
    [ObjectPosition] => 0
    [ObjectIsReadOnly] => 
    [ObjectIsHidden] => 
    [ObjectIsDisabled] => 
    [ObjectIsLocked] => 
    [HasChildren] => 1
    [ChildrenIDs] => Array
        (
            [0] => 27169
            [1] => 21746
            [2] => 26764
            [3] => 26336
            [4] => 41286
            [5] => 19170
            [6] => 24487
            [7] => 24220
            [8] => 38699
            [9] => 18724
            [10] => 54041
            [11] => 58423
            [12] => 22671
            [13] => 52992
            [14] => 28241
            [15] => 16018
            [16] => 51261
            [17] => 20576
            [18] => 25281
            [19] => 30158
            [20] => 36051
            [21] => 21046
            [22] => 26376
            [23] => 15704
            [24] => 12800
            [25] => 19168
            [26] => 17476
            [27] => 51024
            [28] => 29423
            [29] => 16238
            [30] => 16137
            [31] => 24556
            [32] => 45446
            [33] => 17710
            [34] => 14808
            [35] => 11203
            [36] => 47507
            [37] => 53444
            [38] => 12941
            [39] => 10445
            [40] => 32429
            [41] => 54497
            [42] => 10111
            [43] => 11955
            [44] => 21354
            [45] => 36321
            [46] => 54222
            [47] => 12047
            [48] => 56163
            [49] => 25995
            [50] => 11028
            [51] => 16573
            [52] => 12938
            [53] => 12529
            [54] => 57008
            [55] => 32403
            [56] => 21625
            [57] => 30153
            [58] => 10316
            [59] => 55077
            [60] => 44923
            [61] => 27926
            [62] => 38100
            [63] => 22809
            [64] => 33002
            [65] => 24613
            [66] => 10440
            [67] => 30968
            [68] => 39068
            [69] => 35403
            [70] => 49932
            [71] => 15177
            [72] => 18908
            [73] => 42805
            [74] => 30221
            [75] => 17593
            [76] => 40328
            [77] => 40815
            [78] => 27288
            [79] => 18075
            [80] => 27666
            [81] => 18941
            [82] => 49463
            [83] => 33692
            [84] => 53089
            [85] => 31162
            [86] => 19562
            [87] => 55667
            [88] => 20141
            [89] => 20147
            [90] => 32111
            [91] => 32178
            [92] => 22044
            [93] => 32329
            [94] => 47650
            [95] => 32407
            [96] => 22230
            [97] => 12292
            [98] => 43456
            [99] => 33299
            [100] => 23448
            [101] => 33795
            [102] => 39065
            [103] => 34304
            [104] => 34326
            [105] => 44610
            [106] => 34426
            [107] => 35044
            [108] => 35265
            [109] => 40496
            [110] => 35433
            [111] => 35566
            [112] => 50943
            [113] => 35731
            [114] => 35984
            [115] => 51545
            [116] => 36888
            [117] => 57454
            [118] => 37081
            [119] => 37740
            [120] => 48189
            [121] => 32651
            [122] => 43137
            [123] => 38315
            [124] => 38378
            [125] => 38481
            [126] => 38826
            [127] => 59418
            [128] => 38893
            [129] => 39257
            [130] => 39628
            [131] => 39897
            [132] => 50646
            [133] => 41384
            [134] => 46549
            [135] => 21762
            [136] => 53243
            [137] => 43340
            [138] => 33126
            [139] => 43586
            [140] => 43604
            [141] => 43672
            [142] => 43708
            [143] => 44253
            [144] => 39408
            [145] => 44709
            [146] => 44908
            [147] => 14639
            [148] => 45736
            [149] => 46235
            [150] => 46338
            [151] => 56661
            [152] => 46775
            [153] => 51938
            [154] => 47448
            [155] => 47543
            [156] => 52766
            [157] => 27333
            [158] => 52968
            [159] => 58206
            [160] => 38453
            [161] => 38743
            [162] => 49178
            [163] => 49409
            [164] => 18882
            [165] => 50015
            [166] => 29770
            [167] => 19985
            [168] => 52806
            [169] => 22442
            [170] => 53344
            [171] => 54422
            [172] => 54633
            [173] => 34166
            [174] => 54897
            [175] => 55193
            [176] => 26605
            [177] => 41275
            [178] => 12379
            [179] => 39391
            [180] => 48483
            [181] => 41017
            [182] => 12365
            [183] => 47032
            [184] => 56418
            [185] => 21223
            [186] => 51771
            [187] => 38193
            [188] => 24328
            [189] => 11181
            [190] => 47028
            [191] => 50738
            [192] => 34071
            [193] => 45864
            [194] => 38465
            [195] => 57545
            [196] => 57943
            [197] => 24959
            [198] => 16721
            [199] => 25694
        )

)

Da ich aktuell ab 200 Snapshots den Index 0 vom Array entferne, würde das Skript das Medianobjekt mit der ID 21746 entfernen, weil das ja beim nächsten ausführen auf Index 0 rutscht.
ID 21746 liegt aber irgendwo mitten drin, es ist nicht der älteste Snapshot, siehe Screenshot.

Ich hoffe es ist nachvollziehbar.
Vielleicht kannst du das nachstellen, mein komplettes Skript habe ich ja gepostet.

Der Index hat nichts mit irgendeiner Reihenfolge zu tun. Der ist rein willkürlich.
Das ältestes Objekt zu ermitteln musst du selbst lösen, zum Beispiel über den Ident den du setzt oder die Position.
Michael

Hi nall-chan,
aha, dass bringt jetzt Licht ins dunkle.
Warum funktioniert es dann so lange IPS läuft, es ist erst nach einem Neustart durcheinander.
Wird das Array bei neustart neu sortiert?

Nicht beim Neustart, sondern weil du Objekte entfernt und hinzufügst, wird es während der Laufzeit verändert und somit quasi durch dein Script sortiert.
Michael

1 „Gefällt mir“

Ich verstehs zwar noch nicht ganz, weil wenn ich von null anfange uns führe das Skript per Hand aus, wir immer ein neuer Snapshot erstellt und der älteste also Array Index [0] rausgelöscht.
Das kann ich beliebig oft machen, es funktioniert wie gewünscht, bis ich IPS neustarte.

Ich versuche jetzt mal nach Datum den ältesten Snapshot zu löschen, dann sollte das Problem behoben sein.
Ich weiß zwar noch nicht wie ich das anstelle. Falls ich Hilfe brauche melde ich mich.

Was hältst du davon einfach das Array sauber nach der Position (die du ja schön setzt) zu sortieren?

Die Sortierung von GetChildrenIDs ist laut Dokumentation willkürlich. (Aktuelle Implementation ist bei Neustart nach IDs sortiert, während der Laufzeit führen wir einfach neue Objekte hinten dran. Laut Doku ist das aber kein Verhalten auf das man sich verlassen darf.)

paresy

1 „Gefällt mir“

Also dann werde ich versuchen das array von den childrens zu sortieren, so das dass älteste Foto auf index 0 liegt.
Somit sollte das richtige Löschen alter Fotos funktionieren.
Ich setze es auf meine to do Liste und berichte dann mal.

Danke Euch

Also ich habe mich jetzt nochmal mit dem ganzen beschäftigt und ich denke das Ergebnis passt.

Folgender Code arbeitet das ganze bei mir ab.

<?php

$Anzahl_Snapshots = GetValueInteger(24200);
$name = "Kamera Einfahrt";
$ident = "InstarEinfahrt";
//Für Instar 9008 FHD
//$Content = file_get_contents("http://Hans:Wurscht@192.168.17.1/tmpfs/snap.jpg");
//Für Instar 9408 FHD WQHD
$Content = file_get_contents("http://192.168.1.1/snap.cgi?chn=11&user=Hans&pwd=Wurscht");
$filename = time();     //Jede Bild mithilfe von Unix Timestamp unterschiedlich bennennen, damit die Bilder krorrekt in IPS WF. bei Neustart zurückgeladen werden 
$picturename ="$filename";
//$picturename ="Snapshot Kamera Einfahrt";
$catid = 50614;
$MediaID = IPS_CreateMedia(1);                                          // Image im MedienPool anlegen
					IPS_SetParent($MediaID, $catid);                    // Medienobjekt einsortieren unter Kategorie $catid                   
					IPS_SetIdent ($MediaID, $ident.time());             // Unix Timestamp als Ident setzen 
					IPS_SetPosition($MediaID, -time());                 // Unix Timestamp invertieren, somit wird der letze Snapshot im Webfront als erster angezeigt 
					IPS_SetMediaCached($MediaID, true);
                    
					// Das Cachen für das Mediaobjekt wird aktiviert.
					// Beim ersten Zugriff wird dieses von der Festplatte ausgelesen
					// und zukünftig nur noch im Arbeitsspeicher verarbeitet.
					$ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."instar".DIRECTORY_SEPARATOR.$picturename.".jpg";  // Image-Datei
					IPS_SetMediaFile($MediaID, $ImageFile, False);      // Image im MedienPool mit Image-Datei verbinden
					$savetime = date('d.m.Y H:i:s');
					IPS_SetName($MediaID, $name."   ".$savetime);     // Medienobjekt benennen
					//IPS_SetName($MediaID, $name." ".$i);              // Medienobjekt benennen
					//IPS_SetInfo ($MediaID, $savetime);
					IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen
					IPS_SendMediaEvent($MediaID); //aktualisieren

//Handling Anzahl und Reihenfolge der Snapshots 

foreach(IPS_GetChildrenIDs($catid) as $objectID)                        //Ids ermitteln 
    {
        $object = IPS_GetObject($objectID);
        $objectList[$object["ObjectID"]] = $object["ObjectPosition"];   //Id der Snapshots mit den Positionen verbinden, das sollte analog zum Objektbaum sein 
    }   

        asort($objectList);                                             // in aufsteigender Reihenfolge sortieren 
        print_r($objectList);                                           //array ausgeben




$Anzahl = count($objectList); 
print_r($Anzahl);
if ($Anzahl >= $Anzahl_Snapshots) {
            //Anzahl Bilder welche gelöscht werden müssen
            $objectList_del = $objectList;      //Array der ID,s und Positionen umkopieren 
            arsort($objectList_del);            //Array absteigend, gegenläufig zu $objectList sortieren 
            print_r($objectList_del);   
            $objectList_del2 = array_keys($objectList_del);         //Nur keys also die ID, ausgeben weil danach die Medienobjekte identifiziert werden...
            print_r($objectList_del2);

            $delCount = count($objectList) - ($Anzahl_Snapshots);   //Überhang an zu vielen Snapshots errechnen

            for ($i = 0; $i <= $delCount; $i++) {
                IPS_DeleteMedia($objectList_del2[$i], true);        //Überhang an Medienabjekten anhand der ID und des Index rauslöschen.
            }
         }

Könnte das evtl. ein Experte beurteilen ob das so taugt, meine PHP Fähigkeiten sind nicht die besten.

Was mir noch aufgeallen ist, in den Arrays $ObjectList usw steht immer ein Medienobjekt drin welches im Objektbaum eigentlich schon gelöscht wurde.
Siehe Screenshots, woran liegt liegt das???
Hier wurde jetzt AnzahlSnapshots auf 5 eingestellt

Wenn ich das bei mir durchlaufen lasse ein paar Mal bei MaxSnapshots = 5, dann habe ich im Array auch 5 IDs aber nur 4 erstellte Mediadateien… Die zuletzt gelöschte steht noch im Array und nimmt praktisch den „Platz“ weg.

Mal so aus ganz Nicht-Experten-Sicht :wink: Oh ja, hattest Du ja schon geschrieben, sorry!

PS: Wenn hier jemand noch eine Zeile PHP hätte, wie man die (In meinem Beispiel) 5 Bilder in 5 bestehende Mediendateien kopieren könnte wäre das ein ziemlich gutes Wochenende! Stichwort Mediengalerie und feste ID’s…

Dirty Lösung
Zeile 1 einfach +1

$Anzahl_Snapshots = GetValueInteger(24200)+1;