Reihenfolge von Mediaobjekte, einsortieren und nach MAX Anzahl löschen

Hallo,

ich bräuchte bitte mal einen Denkanstoß, ich komm nicht mehr weiter.
Was habe ich vor:
Ich möchte von meiner Webcam einen Snapshot holen und diesen in einem Medienobjekt unterhalb einer Kategorie numerisch von 1 bis Max (Variabel) einsortieren.
Wurde MAX z.B. 100 Snapshots erreicht, soll der 101 ste Snapshot immer gelöscht werden.

DIe Bilder bringe ich schon in die Medienobjekte , siehe Code.
Jedoch scheitere ich beim einsortieren und beim löschen der Snapshots wenn die MAX Anzahl erreicht wurde.
Mit IPS_GetObject und IPS_GetChildrenIDs komme ich nicht weiter, denke aber das dass der richtige Ansatz ist.

Das habe ich bisher gemacht.

<?php
$i = GetValueInteger(44190);



$iMax = 11;

if  ($i == 1)
{
    $i = $iMax;
}
else
{
    $i = $i;
}


$Diff = $i -1;

$name = "Snapshot Kamera Einfahrt";
$ident = "InstarEinfahrt";
$Content = file_get_contents("http://USER:PW@192.168.17.10/tmpfs/snap.jpg");
$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.$Diff);
                    $iSet = $Diff;
					IPS_SetPosition($MediaID, $iSet);
					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.$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." ". $Diff." am ".$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



$i = ($i - 1);  //Index um 1 reduzieren

SetValueInteger (44190,$i);    // Indexvariable neu beschreiben


$Info_Snapshots = IPS_GetObject(50614);
var_dump($Info_Snapshots);

$Info_Snapshots_Child = IPS_GetChildrenIDs(50614);
var_dump($Info_Snapshots_Child);

var_dump($i);
var_dump($Diff);

$Var_Info = IPS_GetVariable($Info_Snapshots_Child);

Das Skript (Test) enthält den Code.

Danke schon mal.

Nimm doch einfach das Bildarchiv von Symcon.

Michael

1 „Gefällt mir“

Danke, habs getestet, dass ist fast das was ich gesucht hatte. Nur die Reihenfolge wie die Bilder angezeigt werden ist genau andersrum als ich es wollte.
Damit kann ich aber leben.

Was müsste ich in dem Teil von meinem Skript eigentlich umbauen damit ich immer nur ein Bild habe.
Dieses Bild soll dann vom neuen Snapshot überschrieben werden.
Das Modul soll sich dann immer das aktuelle Bild holen.

Den Index bis auf zwei hochzählen und dann das Bild Nr. 2 löschen bekomme ich mit IPS-Delete_Media nicht in den Griff.

$name = "Snapshot Kamera Einfahrt";
$ident = "InstarEinfahrt";
$Content = file_get_contents("http://USER:PW@192.168.17.10/tmpfs/snap.jpg");
$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.$Diff);
                    $iSet = $Diff;
					IPS_SetPosition($MediaID, $iSet);
					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.$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." ". $Diff." am ".$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

Habs jetzt gelöst bekommen.
Mit dem Modul bin ich nicht zum Ergebnis gekommen weil sich die ID des Bildes welches ich mit dem Modul abhole beim aktualisieren immer ändert.
Keine Ahnung, wie ich das umsetzen hätte sollen.

So habe ich es gelöst, vielleicht kanns einer brauchen.

<?php

$Anzahl_Snapshots = GetValueInteger(14244);
$name = "Snapshot Kamera Einfahrt";
$ident = "InstarEinfahrt";
$Content = file_get_contents("http://BN:PW@192.168.178.1/tmpfs/snap.jpg");
$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.$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."  am ".$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);

Ich habe als Index einfach den UNIX Timestamp genommen und den dann invertiert, somit kann man das letzte Bild immer als erstes anzeigen lassen.
(Geht bestimmt eleganter)
Dann habe ich die Anzahl der Snapshots gesetzt und ab erreichen dieser, lösche ich den ersten Index [0] des Arrays vom Parent.

Was ich nicht genau weiß: Sind meine Fotos jetzt gecached ? Normal schon oder?
Im Ordner Media ist zumindest keines davon.

Ein Beitrag wurde in ein neues Thema verschoben: Wünsch zum Bildarchiv

Also die Fotos werden erfolgreich gechached, habs paar mal ausprobiert, Fotos werden in den media Ordner gespeichert.

Aber was mir wieder aufgefallen ist, dieses Verhalten hatte ich schon mal beim Instar Modul.

Nachdem ich den IPS Dienst wieder starte haben alle Medienobjekte im Medienpool die selbe Aktualsierungszeit (Das lässt sich ja mit dem Start des Dienstes erklären) aber alle Bilder sind dann auf einmal gleich. Also wenn ich vor dem Neustart 30 Bilder hatte, habe ich jetzt 30 gleiche Bilder mit gleichem Zeitstempel im WF.

Kann mir das jemand erklären?

Danke…

Ja, du setzt ja für alle Medien die gleiche Datei in
$ImageFile.
Somit gibt es nur ein Bild auf dem Datenträger.
Setze für jedes Objekt eine eigene Datei und gut ist.
Michael

Habe jetzt dem Dateinamen auch noch den Unix Time stamp verpasst. Somit ist jedes Bild unterschiedlich benannt.
Funktioniert jetzt…

Hallo Goifalracer,
wärst du so nett und postest dein ganzes Skript nochmal hier ein? Ich würde es gerne auch mal ausprobieren.

Viele Grüße
marvus

Dito. Wäre an der Nummer auch sehr interessiert!

Also so habe ich das umgesetzt.

<?php

$Anzahl_Snapshots = GetValueInteger(14244);
$name = "Kamera Einfahrt";
$ident = "InstarEinfahrt";
$Content = file_get_contents("http://Hans:wurscht@192.168.178.10/tmpfs/snap.jpg");
//Für Doorbird
//$Content = file_get_contents("http://hans:wurscht@192.168.178.41/bha-api/image.cgi");
$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);
$ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."instar".DIRECTORY_SEPARATOR.$picturename.".jpg";  // Image-Datei

Hier einfach in var/lib/symcon/media den Ordner eurer Wahl erstellen. Bei mir ist es ein Raspberry…

Hier der Baum dazu.

Im WF werden die neusten Bilder oben hinzugefügt und ab (Anzahl Snapshots MAX) das älteste gelöscht.

Je nach Kameramodell (file_get_contents) anpassen.
Die Bilder werden nur in den RAM geladen und werden dann beim beenden von Symcon in den angegeben Pfad abgelegt.

Das Skript dann einfach nach belieben ausführen z.B. wenn Bewegungsmelder ausgelöst hat.
Ich habs bei mir mit dem Instar Alarmserver via WebHook verknüpft und in die Alarmanlage eingebunden.

Das Modul Bild-Archiv macht aber das selbe nur die Reiehenfiolge der Bilder ist anders.

Ich hoffe das hilft Euch.

1 „Gefällt mir“

Hallo zusammen,

so etwas habe ich schon lange gesucht … super!
Ich habe es getestet und funktioniert soweit auch ganz gut und habe noch eine Frage dazu.

Ich mir habe in IPSView eine Seite erstellt, wo ich 20 Medienobjekte fix eingfügt habe. Auf diesen Medienobjekten sollen die letzten 20 Alarme per Snapshot dargestellt werden und bei einem neuen Alarm fällt quasi der älteste Snapshot raus. Jetzt ist es bei eurem Skript aber so, dass immer wieder neue IDs erstellt werden und somit ich theoretisch immer wieder die IDs neu in IPSView verknüpfen müsste. Ich hoffe das ist jetzt einigermaßen rüber gekommen :slight_smile:

Die Bilder sollen praktisch immer weitergeschoben werden … jedoch von ID zu ID wobei die IDs fix bleiben.
Habt ihr eine Idee wie man das lösen kann?

Da müsstest du mal mit

IPS_SetPosition($MediaID, -time());

experimentieren.

Ich verstehe was du meinst.
Es ist sicherlich möglich.
Dem neusten Snapshot gibst du immer die gleiche ID welche von dr Reihenfolge ganz oben einsortiert wird.

Ich habe gerade versucht deine beschriebenen Schritte auszuführen. Leider habe ich keine Berechtigung auf den Symcon-Ordner zuzugreifen. Wie löse ich das?

@sunni2002 Konntest du das schon lösen?

Viele Grüße
marvus

Entweder mit „sudo chmod 777“ auf den Ordner ausführen. oder einfach mit Rechtsklick auf den Ordner klicken und bei Berechtigungen lesen/schreiben für „Jeder“ auswählen.
Die Rechte für die vorgelagerten Ordner müssen natürlich auch passen.

Teste das mal.
Versuch mal, dich mit dem Linux Rechte-system auseinander zu setzen, das hilft viel.
Und man könnte dan auch seine Rechte - Vergabe extrem gut und sicher strukturien.

„sudo chmod 777“ ist nicht die feine Art, weil dann jeder Zugriff hat.

Danke, ich habe mit „sudo chmod 777 + Pfad“ den Zugriff gesetzt und ihn danach mit „sudo chmod -777 + Pfad“ wieder entfernt. Zumindest konnte ich es jetzt so lösen, auch wenn es nicht die feine Art ist. Rechtsklick hatte nicht funktioniert.
Ich konnte das Skript nun aufgrund deiner guten Anleitung (mit Screenshots etc.) umsetzen.
Vielen Dank dafür.

Ich bräuchte jetzt nur noch jemanden, der mir zeigt, wie ich es im IPS Designer umsetzen kann, dass sich die IDs immer erneuern. Dann könnte ich mir dort ein Raster z.B. 3x10 aufbauen. Kann mir da jemand helfen?

Vielleicht könnte @Brownson uns da unterstützen, da es ja sicherlich für viele nützlich sein könnte.

Viele Grüße
marvus

Mit IPS View kan ich dich leider nicht unterstützen.
Aber es wäre von Vorteil wenn sich jemand meldet, dass auch öffentlich gemacht wird.

Irgendwann ist bei mir auch IPS View geplant…

Vielleicht ist da was dabei

Danke @goifalracer für die tolle Vorarbeit. :+1:
Ich verwende dies nun da meine Reolink kein kleines Bild erstellen kann über das ONVIF-Modul, da diese nicht 100% kompatibel ist.
Aber dieses Script ist ein guter weg, Schnappschuss und Bildarchiv in einem…

Habe es noch ein wenig angepasst…
-Das Script kommt mit weniger Voreinstellungen aus…
-Die Anzahl der gewählten Bilder stimmte nun…
-Die Bilder werden nun beim Neustart von IPS übernommen…
-Eine automatische Erstellung einer Kategorie mit den Bildern als Inhalt direkt unterhalb des Scripts findet nun statt, so lässt sich das Archiv gut in die Visualisierung verlinken…

Wenn es jemand brauchen kann:

<?php

$Archivname = "Bildarchiv Personen";
//$Anzahl_Snapshots = GetValueInteger(14244);
$Anzahl_Snapshots = 5; //Wenn keine Varibale zur Definition der Anzahl vorhanden
$name = "Cam Carport";
$ident = "ReolinkCarport";
$Content = file_get_contents("http://192.168.178.101/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=%E2%80%8B123456789%E2%80%8B&user=admin&password=xxxxxx&width=1536&height=576");
$filename = time();     //Jede Bild mithilfe von Unix Timestamp unterschiedlich bennennen, damit die Bilder krorrekt in IPS WF. bei Neustart zurückgeladen werden 
$picturename = "$ident.$filename";

$catid = @IPS_GetCategoryIDByName($Archivname, $_IPS['SELF']);
if ($catid === false){
$catid = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($catid, $Archivname); // Kategorie benennen
IPS_SetParent($catid, $_IPS['SELF']); // Kategorie einsortieren unterhalb des Script;
}


$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.$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_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 
$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
    }

Nichts zu danken, man soll sich ja gegenseitig helfen.
Ich muss mal schauen, weil in diesem skript noch Fehler sind im Bezug auf die Anzahl der Bilder und wenn Symcon neugestartet wird, kommt die Reihenfolge der Bilder durcheinander.

Das habe ich aber schon gelöst,muss den link mal suchen.