Dreamboxen mit IPS steuern

Moin!

Warum sieht das in der 1. Zeile so aus, als würdest du die .TS (den Videostream) holen?!?

Und das sieht so aus, als würde da ein String kommen und kein XML Kram:

Fatal error: Uncaught exception ‚Exception‘ with message ‚String could not be parsed as XML‘ in D:\IP-Symcon\scripts\f_Enigma_2.ips.php:1242

Hast du dir das mal genauer angeschaut an der Stellte?

Unabhängig davon könnte man „file_get_contents“ durch „SYS_GetURLContent“ austauschen.

>> Poste doch bitte mal dein ganzes Script und was du da sonst so machst. So bekommt man keinen richtigen Einstieg…

Grüße,
Chris

Das ist nicht der Stream sondern nur die Bezeichnung der Aufnahme die ich zum Löschen übergeben muss.

Ich habe mal probiert „file_get_contents“ durch „SYS_GetURLContent“ auszutauschen, da bekomme ich folgende Fehlermeldung:


Warning:  Socket Error # 11001
Host not found. in D:\IP-Symcon\scripts\f_Enigma_2.ips.php on line 1243

Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in D:\IP-Symcon\scripts\f_Enigma_2.ips.php:1243
Stack trace:
#0 D:\IP-Symcon\scripts\f_Enigma_2.ips.php(1243): SimpleXMLElement->__construct('')
#1 D:\IP-Symcon\scripts\38405.ips.php(4): ENIGMA2_MovieDelete('192.168.55.37:8...', '1%3A0%3A0%3A0%3...')
#2 {main}
  thrown in D:\IP-Symcon\scripts\f_Enigma_2.ips.php on line 1243
Abort Processing during Fatal-Error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in D:\IP-Symcon\scripts\f_Enigma_2.ips.php:1243
Stack trace:
#0 D:\IP-Symcon\scripts\f_Enigma_2.ips.php(1243): SimpleXMLElement->__construct('')
#1 D:\IP-Symcon\scripts\38405.ips.php(4): ENIGMA2_MovieDelete('192.168.55.37:8...', '1%3A0%3A0%3A0%3...')
#2 {main}
  thrown
   Error in Script D:\IP-Symcon\scripts\f_Enigma_2.ips.php on Line 1243

Zum Besseren Verständis:

Ich möchte mir eine Liste der Aufnahmen ausgeben lassen und in der Liste die Möglichkeit haben einzelne Aufnahmen zu löschen.

Dazu hole ich mir zunächst die Aufnahmeliste mit:


/*
* Movie List, zeigt Liste alle Aufnahmen
*/
function ENIGMA2_getMovieList($ipadr)
{

   $string = file_get_contents("http://".$ipadr."/web/movielist?dirname=/hdd/movie/&tag=");
	$xml = new SimpleXMLElement($string);
	$number = ($xml->e2movie->count());

	if ($number < 1)
	{
		$error = "Es wurden keine Aufnahmen gefunden!";
		return array("error" => $error);
	}

	$service = array();
  $movielist = $xml->e2movie;
    foreach ($movielist as $moviexml)
		{
		$name = utf8_decode("$moviexml->e2servicename"); //Sendername
		$titel = utf8_decode("$moviexml->e2title"); // Titel der Aufnahme
		$desc = utf8_decode("$moviexml->e2description");
      $desc =  str_replace('Š','<br>',$desc);
		$xdesc = utf8_decode("$moviexml->e2descriptionextended");
      $xdesc =  str_replace('Š','<br>',$xdesc);
		//$name = ("$moviexml->e2servicename");
		//$titel = ("$moviexml->e2title");
      //$xdesc = ("$moviexml->e2descriptionextended");
		//$desc = ("$moviexml->e2description");
		$filename = ("$moviexml->e2filename");
		$filesize = ("$moviexml->e2filesize");
		$filesize = round((int)$filesize/1048576);
		$length = ("$moviexml->e2length");
		$time = getdate("$moviexml->e2time");
		$tbeg = utf8_decode("$moviexml->e2time");
		$pos = strpos($length, ":");
			if ($pos == 2)
				{
				$min = substr($length, 0, 2);
				$sek = substr($length, 3, 2);
				$unixlength = ((int)$min*60)+(int)$sek;
				}
			elseif ($pos == 1)
				{
				$min = substr($length, 0, 1);
				$sek = substr($length, 2, 2);
				$unixlength = ((int)$min*60)+(int)$sek;
				}
			elseif ($pos == 3)
				{
				$min = substr($length, 0, 3);
				$sek = substr($length, 4, 2);
				$unixlength = ((int)$min*60)+(int)$sek;
				}
  		
		$tend = (int)$tbeg+(int)$unixlength;
		$tag = $time['mday'];
		$monat = $time['mon'];
		$jahr = $time['year'];
		$date = $time['mday'].".".$time['mon'].".".$time['year'];
    	$time = ("$time[hours]:$time[minutes]");
    	$sref = ("$moviexml->e2servicereference");
      $sref = utf8_decode(str_replace(':','%3A', $sref));
		$sreftimer = substr($sref, 0, 20);
    	$sreftimer = str_replace(':','%3A', $sreftimer);
		$pref = str_replace(':','_',"$moviexml->e2servicereference");

			$movie[] = array(
				"name" => $name,
				"titel" => $titel,
				"desc" => $desc,
				"filename" => $filename,
				"filesize" => $filesize,
				"length" => $length,
				"time" => $time,
				"tbeg" => $tbeg,
				"tend" => $tend,
				"tag" => $tag,
				"monat" => $monat,
				"jahr" => $jahr,
				"date" => $date,
				"xdesc" => $xdesc,
				"sref" => $sref,
				"sreftimer" => $sreftimer,
				"pref" => $pref,
				"anzahl" => $number
			);
		}
	return $movie;
}

Dann lasse ich die Liste in ein String (HTML Box) ausgeben:


include(IPS_GetScriptFile(44202 /*[Erdgeschoss\Wohnzimmer\Dreambox 8000\Funktionen\f_Enigma_2]*/)); //f_Enigma_2
set_time_limit(120); //Timeout auf 30s setzen
// Zeigt eine Liste Aufnahmen an
$movielist = ENIGMA2_getMovieList($ipadr);
$anzahl = $movielist[0]['anzahl']; // Zahl der Aufnahmen
$capacity = ENIGMA2_GetBoxInfo($ipadr);


$HTMLData = ENIGMA_GetTableHeader();
$HTMLData .= '<tr><td>Anzahl Aufnahmen: '.$anzahl.'</td><td>Festplattenplatz: '.$capacity[0]['capacity'].'</td><td>Freier Speicherplatz: '.$capacity[0]['hddfree'].'</td></tr>'.PHP_EOL; // Festplattenplatz und Anzahl der Aufnahmen
$i = 0;
foreach($movielist as $movie)
	{
   	$i = $i+1;
		if ($i % 2 != 0)
				{

				$HTMLData .= '<tr class="row_0"><td rowspan="2"><img src="picon/'.$movie['pref'].'.png" alt="logo"></td><td>'.$movie['titel'].'</td><td><a href="http://'.$ipadr.'/web/moviedelete?sRef='.$movie['sref'].'">Delete</a></td></tr>'.PHP_EOL; // Picon Name delete
				$HTMLData .= '<tr class="row_0"><td>'.$movie['name'].'</td><td></td></tr>'.PHP_EOL; // Sendername
				$HTMLData .= '<tr class="row_0"><td>'.$movie['tag'].".".$movie['monat'].".".$movie['jahr'].'</td><td>'.$movie['desc'].'</td><td>Play</td></tr>'.PHP_EOL; // Links: Datum Rechts: Beschreibung
            $HTMLData .= '<tr class="row_0"><td></td><td rowspan="3">'.$movie['xdesc'].'</td><td></td></tr>'.PHP_EOL; // Beschreibung voll
				$HTMLData .= '<tr class="row_0"><td>'.$movie['time'].' Uhr</td><td></td></tr>'.PHP_EOL; // Uhrzeit
				$HTMLData .= '<tr class="row_0"><td>'.$movie['length'].' Minuten</td><td></td></tr>'.PHP_EOL; // Dauer
				//$HTMLData .= '<tr class="row_0"><td>'.$movie['tbeg'].'</td><td>'.$movie['sreftimer'].'</td><td>'.$movie['tend'].'</td></tr>'.PHP_EOL; // sreftimer
				$HTMLData .= '<tr class="row_0"><td></td><td>'.$movie['sref'].'</td><td></td></tr>'.PHP_EOL; // sref
				$HTMLData .= '<tr class="row_0"><td></td><td>'.$movie['filename'].'</td><td>'.$movie['filesize'].' MB</td></tr>'.PHP_EOL; // Filename
				$HTMLData .= '<tr class="row_0"><td></td><td></td><td></td></tr>'.PHP_EOL; // Leerzeile
				}
		else
			 	{

            $HTMLData .= '<tr class="row_1"><td rowspan="2"><img src="picon/'.$movie['pref'].'.png" alt="logo"></td><td>'.$movie['titel'].'</td><td><a href="http://'.$ipadr.'/web/moviedelete?sRef='.$movie['sref'].'">Delete</a></td></tr>'.PHP_EOL; // Picon Name delete
				$HTMLData .= '<tr class="row_1"><td>'.$movie['name'].'</td><td></td></tr>'.PHP_EOL; // Sendername
				$HTMLData .= '<tr class="row_1"><td>'.$movie['tag'].".".$movie['monat'].".".$movie['jahr'].'</td><td>'.$movie['desc'].'</td><td>Play</td></tr>'.PHP_EOL; // Links: Datum Rechts: Beschreibung
            $HTMLData .= '<tr class="row_1"><td>'.$movie['tag'].".".$movie['monat'].".".$movie['jahr'].'</td><td rowspan="3">'.$movie['xdesc'].'</td><td></td></tr>'.PHP_EOL; // Beschreibung voll
				$HTMLData .= '<tr class="row_1"><td>'.$movie['time'].' Uhr</td><td></td></tr>'.PHP_EOL; // Uhrzeit
				$HTMLData .= '<tr class="row_1"><td>'.$movie['length'].'</td><td></td></tr>'.PHP_EOL; // Dauer
				//$HTMLData .= '<tr class="row_1"><td></td><td>'.$movie['sreftimer'].'</td><td></td></tr>'.PHP_EOL; // sreftimer
				$HTMLData .= '<tr class="row_1"><td></td><td>'.$movie['sref'].'</td><td></td></tr>'.PHP_EOL; // sref
				$HTMLData .= '<tr class="row_1"><td></td><td>'.$movie['filename'].'</td><td>'.$movie['filesize'].' MB</td></tr>'.PHP_EOL; // Filename Filesize
				$HTMLData .= '<tr class="row_1"><td></td><td></td><td></td></tr>'.PHP_EOL; // Leerzeile
			 	}
	}
$HTMLData .= ENIGMA_GetTableFooter();


SetValueString(14155 /*[Erdgeschoss\Wohnzimmer\Dreambox 8000\Aufnahmeliste]*/  , $HTMLData);

Grundsätzlich lässt sich so auch die Aufnahme löschen. Mein Problem ist nur wenn ich auf delete drücke löscht er die Aufnahme und wechselt auf die Webseite der Dreambox mit dem Response also aus dem Webfront raus. Ich suche nun eine Möglichkeit wie ich den Befehl zum Löschen absetzten kann ohne das ich aus der Ansicht des Webfront rauskomme sondern eben nur eine kurze Mitteilung bekomme das das Löschen erfolgreich war.:confused:

Daher wollte ich ausprobieren mit einem Formularbutton eine Funktion aufzurufen die mir dann die Aufnahme löscht. beim Aufrufen der Funktion erscheint dann aber leider der oben genannte Fehler.

Wenn also jemand eine Idee hat wie ich in einer HTML Box einen Befehl absetzten kann ohne die HTMLBox bzw. das Webfront zu verlassen wäre ich dankbar.

Die Funktion die ich aufrufe ist einfach nur:

/*
* Löscht eine Aufnahme auf der Festplatte
*/
function ENIGMA2_MovieDelete($ipadr, $sref)
{
    $xmlResult = new SimpleXMLElement(SYS_GetURLContent("http://'.$ipadr.'/web/moviedelete?sRef='.$sref"));
	//$xmlResult = new SimpleXMLElement(file_get_contents('http://'.$ipadr.'/web/moviedelete?sRef='.$sref));
   return $xmlResult;
}

Ah jetzt ja…eine Insel :smiley: Jetzt verstehe ich dich :slight_smile:

Spontan ohne groß drüber nachzudenken würde ich sagen > pack das Löschen in ein anderes IPS-Skript und ruf das, aus der HTML Box, mit einem Button, über die IPS-API, auf. Mit Übergabe von IP und „sref“.
IPS Funktionen in einer HTMLBox nutzen

Grüße,
Chris

Das mit dem Senden und Aufrufen von einem Script bzw. Funktion habe ich ja schon probiert. Ich habe dafür einfach JSON benutzt wie hier beschrieben

Datenaustausch — IP-Symcon :: Automatisierungssoftware
Das Problem bleibt aber leider trotzdem bestehen da ich ja die besagte Fehlermeldung s.o. bekomme wenn ich die Funktion aufrufen will. Ich müsste also die Funktion anpassen damit diese keinen Fehler auswirft. Hast Du dazu noch eine Idee?

Fehler-Ausgabe unterdrücken kann man mit einem „@“

/* 
* Löscht eine Aufnahme auf der Festplatte 
*/ 
function ENIGMA2_MovieDelete($ipadr, $sref) 
{ 
    $xmlResult = new SimpleXMLElement(@SYS_GetURLContent("http://'.$ipadr.'/web/moviedelete?sRef='.$sref")); 
    //$xmlResult = new SimpleXMLElement(@file_get_contents('http://'.$ipadr.'/web/moviedelete?sRef='.$sref)); 
   return $xmlResult; 
}

Aber statt nur zu unterdrücken, sollte man eher dem Fehler auf die Schliche kommen… Außer es funktioniert alles und es ist nur ein doofes Fehler der unwichtig ist :smiley:

2 Meldungen sind ja „speziell“ bei dir:
>> Host not found
>> String could not be parsed as XML

Wobei der 2. Fehler vmtl. ein Folgefehler zum 1. Fehler ist.

Welches Objekt hat bei dir diese ID > 11001 ??

Grüße,
Chris

Abend!

Hab mir grad mal das Dreambox „Projekt“ eingebaut, welches du vermutlich im Einsatz hast. Und beim Skript „Sender Anzeigen“ kommt bei mir der gleiche Fehler - WENN ich gerade eine Aufnahme anschaue.

Aber so allgemein…bei dem Projekt, welches über den Installer von Raketenschnecke installiert wird, ist VIIIIEL Arbeit reinzustecken, damit man da was von verwenden kann. So „out of the box“ funktioniert da bei mir kaum was.

Grüße,
Chris

Ich habe die Fehlerursache hoffentlich gefunden muss aber noch testen ob nicht doch noch irgendwelche Fehler auftreten. Ursache ist einerseits das die sref Leerzeichen enthält. Diese müssen bevor sref an die Funktion bzw. file_get_contents übergeben wird durch %20 ersetzt werden. Der zweite Fehler lag in der Schreibweise bei der Funktion.


/* 
* Löscht eine Aufnahme auf der Festplatte 
*/ 
function ENIGMA2_MovieDelete($ipadr, $sref) 
{ 
    
    $xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/moviedelete?sRef=$sref")); 
   return $xmlResult; 
}  

sollte jetzt wohl gehen. Wenn ich alles ausgiebig getestet habe poste ich es dann hier rein.

Moin,

hier evtl kanns noch anders wer gebrauchen:

ZAP Funktion sucht den Sender und schaltet um

/*****************************************************************************************************
* Zu einem Sender ZAPEN
*/
function ENIGMA2_ZAP($IP,$Suche)
{
	$xmlResult = new SimpleXMLElement(file_get_contents("http://$IP/web/getallservices"));

	$bouquet = 0;
	$service = 0;
	$i = 0;


	$count_bouquet = $xmlResult->e2bouquet->count();
	$count_service = $xmlResult->e2bouquet[$bouquet]->e2servicelist->e2service->count();

	for ($i = 0; ; $i++) {
		if($service >= $count_service)
		{
	   	$bouquet++;
	   	if($bouquet > ($count_bouquet -1))
	   	{
	   	   return "nicht gefunden";
	   		break;
	   	}
      	$count_service = $xmlResult->e2bouquet[$bouquet]->e2servicelist->e2service->count();
	   	$service = 0;
		}else
		{
			$temp_ref = $xmlResult->e2bouquet[$bouquet]->e2servicelist->e2service[$service]->e2servicereference;
 			$temp_name = $xmlResult->e2bouquet[$bouquet]->e2servicelist->e2service[$service]->e2servicename;

	   	if($temp_name == $Suche)
	   	{
	      	//Sender Schalten
	      	//http://dreambox/web/zap?sRef={servicereference}
         	new SimpleXMLElement(file_get_contents("http://$IP/web/zap?sRef=$temp_ref"));
            return "umgeschaltet";
	      	break;
			}else
			{
				$service++;
  			}
		}
	}
}

Hallo,
ist es möglich aus IPS heraus z.b. die Gelbe Taste abzufragen? Also wenn diese Taste gedrückt wird dann soll im IPS was passieren…

Da musst Du mal im Dreambox Forum fragen ob es z.B. möglich ist mit Bluepanel auf Gelb eine Aktion zu legen das ein http Request abgesetzt wird. Dann könntest Du den http Request der Dreambox entgegennehmen den eigentlichen Befehl für Gelb ausführen und das ausführen warum Du willst das IP-Symcon den Tastendruck mitbekommt.

wenn ich die gelbe taste drücke geht camfos auf der VU Solo 4k auf und zeigt meine Aussenkamera. hätte das auch gern auf IPS… was ich damit dann konkret machen möchte weiß ich ehrlich gesagt noch garnicht:-D
Wie kann ich einen Request von z.b. einem WLAN Modul abgreifen… dieser sendet an die VU einen Befehl das die gelbe taste gedrückt wird… Habe PRaktisch schon den Auslöser…wie kann ich diesen in IPS abgreifen… Bin leider kein IT PRofi aber hab nen kompetenteren Nachbarn der das dann sicherlich mit mir hinbekommt:-)

…was hättest Du nun gerne im IPS? Das Du die gelbe Taste quasi aus IPS heraus simulierst? Das geht…

Oder das das Cam-Bild im IPS ist? Das geht auch…

Joachim

weiter frage ist: wenn ich den befehl z.b. sekündlich abfrage belaste ich mir doch das netz?!
Tatbestand ist folgender: gehe mit meinem Klingeltaster auf ein NodeMcu Lua CH340G ESP8266 . dieses sendet dann den befehl Gelbe taste an der Vu und das Bild erscheint auf dem TV. möchte dies aber evtl gern in IPS weiterverarbeiten… Danke für Tips:)

@ Joachim: das das Cambild wenn es klingelt im IPS aufpoppt

…dann brauchst Du doch das Klingelsignal im IPS?

JA… das klingelsignal geht an das: NodeMcu Lua CH340G ESP8266
Dieses sendet per WLAN ein Signal an die VU…
Also müsste ich dieses Signal nur per IPS abfragen…

…wohl eher „anfangen“…[emoji6]
Aber wenn er per WLAN sendet sollte das ja funktionieren…

Joachim

Und wie „fange“ ich das ein:-D ? kannst du mir da weiterhelfen?