Erstellen eines Mediaobjektes aus URL

Hallo Leute,

wenn ich im Browser diesen Link

http://192.168.178.20/grab?format=jpg&r=860

aufrufe wird eine Bild angezeigt.

Ich habe nun versucht dieses in ein Mediaobjekt zu bekommen. Dem Beispiel aus der Dokumentation folgenden wäre das so:

$ImageFile = xxx("http://192.168.178.20/grab?format=jpg&r=860");     // Image-Datei
$MediaID = IPS_CreateMedia(1);                  // Image im MedienPool anlegen
IPS_SetMediaFile($MediaID, $ImageFile, true);   // Image im MedienPool mit Image-Datei verbinden
IPS_SetName($MediaID, "Alarm"); // Medienobjekt benennen
IPS_SetParent($MediaID, 12345); // Medienobjekt einsortieren unter dem Objekt mit der ID "12345"

Für „xxx“ habe ich diverse PHP-Funktionen getestet (file_get_Contents, fopen, usw.), doch leider funktioniert das so nicht…

Was wäre die richtige PHP-Funktion, um dieses jpg in das Mediaobjekt zu bekommen?

Joachim

Den Content holst mit mit was auch immer file_get_contents, curl usw.

Ablegen dann mit


$name = "Blablub Bild";
$i = 1; // Position
$ident = "blablubjpg";
$Content = file_get_contents("http://192.168.178.20/grab?format=jpg&r=860");
$picturename ="blablub";
$MediaID = IPS_CreateMedia(1);                  // Image im MedienPool anlegen
					IPS_SetParent($MediaID, $catid); // Medienobjekt einsortieren unter Kategorie $catid
					IPS_SetIdent ($MediaID, $ident.$i);
					IPS_SetPosition($MediaID, $i);
					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." ".$i." ".$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	

Vielen Dank!

Das werde ich mal ausprobieren und melde mich dann…:wink:

Joachim

Hallo Fonzo,

ich habe Dein Skript mal als Vorlage genommen und es in zwei Abschnitte geteilt. Der erste soll das Mediaobjekt im IPS zunächst einmal vorbereiten:

	private function RegisterMediaObject($Name, $Typ, $Parent, $Position, $Cached)
	{
		if (!IPS_MediaExists($this->GetIDForIdent($Name))) {
			 // Image im MedienPool anlegen
			$MediaID = IPS_CreateMedia($Typ); 
			// Medienobjekt einsortieren unter Kategorie $catid
			IPS_SetParent($MediaID, $Parent);
			IPS_SetIdent ($MediaID, $Name);
			IPS_SetName($MediaID, $Name);
			IPS_SetPosition($MediaID, $Position);
                    	IPS_SetMediaCached($MediaID, $Cached);
		}  
	return;
	}      

Aufruf:

$this->RegisterMediaObject("Screenshot", 1, $this->InstanceID, 1000, true);

Es wird dabei auch ein Medienobjekt angelegt, es hat a er das rote Ausrufezeichen im Objektbaum, wahrscheinlich weil noch keine Datei hinterlegt ist?

Im zweiten Teil die Funktion, die erst nach Aufruf einen Bild hinterlegen soll:

public function GetScreenshot()
	{
		$Content = file_get_contents("http://".$this->ReadPropertyString("IPAddress")."/grab?format=jpg&r=860");
                $ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."Screenshot.jpg";  // Image-Datei
                IPS_SetMediaFile($this->GetIDForIdent("Screenshot"), $ImageFile, true);    // Image im MedienPool mit Image-Datei verbinden
                IPS_SetMediaContent($this->GetIDForIdent("Screenshot"), base64_encode($Content));  //Bild Base64 codieren und ablegen
	return;
	}  

Aber: Funktioniert so leider nicht…:frowning:
Ich vermute mal: zunächst sind die Bilddaten in $content, das File „Screenshoot.jpg“ gibt es noch nicht - kommt eine Warnung. Aber wenn ich versuche das Bild zu öffnen kommt die Fehlermeldung „Bitmap ist ungültig“…

Eine Idee wo der Fehler liegt?

Joachim

…habe es hinbekommen!:smiley:

Aufruf zur Erstellung des Mediaobjektes:

$this->RegisterMediaObject("Screenshot", 1, $this->InstanceID, 1000, true, "Screenshot.jpg");

Funktion zum Erstellen des Medienobjektes im Modul:

	private function RegisterMediaObject($Name, $Typ, $Parent, $Position, $Cached, $Filename)
	{
		if (!IPS_MediaExists($this->GetIDForIdent($Name))) {
			 // Image im MedienPool anlegen
			$MediaID = IPS_CreateMedia($Typ); 
			// Medienobjekt einsortieren unter Kategorie $catid
			IPS_SetParent($MediaID, $Parent);
			IPS_SetIdent ($MediaID, $Name);
			IPS_SetName($MediaID, $Name);
			IPS_SetPosition($MediaID, $Position);
                    	IPS_SetMediaCached($MediaID, $Cached);
			$ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR.$Filename;  // Image-Datei
			IPS_SetMediaFile($MediaID, $ImageFile, false);    // Image im MedienPool mit Image-Datei verbinden
		}  
	return;
	}     

…und die Funktion zum Erstellen des Screenshots:

public function GetScreenshot()
	{
		$Content = file_get_contents("http://".$this->ReadPropertyString("IPAddress")."/grab?format=jpg&r=860");
                IPS_SetMediaContent($this->GetIDForIdent("Screenshot"), base64_encode($Content));  //Bild Base64 codieren und ablegen
		IPS_SendMediaEvent($this->GetIDForIdent("Screenshot")); //aktualisieren  
	return;
	} 

Vielen Dank!

Joachim

Prima das es geklappt hat, hast den Fehler ja selbst gefunden du hattest true statt false gesetzt und das Bild gibt es ja aber nicht zum Zeitpunkt des Zuweisens. Wenn Du das als Funktion in Deinem Modul nutzen willst würde ich außerdem darauf achten das Du entweder die ident noch seperat übergibst oder aber die ident innerhalb der Funktion aus dem Name errechnest, also mögliche Umlaute und Leerzeichen aus dem Name entfernst. Wenn Du Ident sonst gleich Name setzt läufst Du Gefahr das Du einen schönen Namen vergibst der dann aber nicht für eine Ident gültig ist.

Hallo Fonzo,

war gestern zwischen Tür und Angel…:wink:

Da gibt es sicherlich noch Verbesserungspotential, war aber dann gestern erst einmal zufrieden weil es lief und zumindest einen Anteil von Übertragbarkeit hat.

Joachim