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.
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.
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
<?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);
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.
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
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?
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?
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.
Danke @goifalracer für die tolle Vorarbeit.
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.
Das mit der Anzahl Bilder habe ich gesehen und in der obigen Version korrigiert.
Das mit der Reihenfolge konnte ich nicht feststellen, aber wenn Symcon aus irgendeinem Grund abstürzt kann nicht mehr auf die Bilder zugegriffen werden. Darum habe ich nun auch die Cache-Funktion deaktiviert, sonst sind die Bilder futsch beim abrupten Beenden des Dienstes.
Das ist das Script, welches die Reihenfolge korrekt sortiert.
<?php
$Anzahl_Snapshots = GetValueInteger(24200)+1;
$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.
}
}