Dreamboxen mit IPS steuern

Hallo,
erstmal ein Gruss an alle Mitstreiter.
Ich bin nun seit 1 Woche auch stolzer Besitzer von IPS.
Als erstes Projekt wollte ich mal meine Dreamboxen mit IPS steuern.

Da ich auch noch absoluter Anfänger in PHP bin,
wollte ich euch mal mein erstes Programm vorstellen, und hoffe
auf Verbesserungs/Optimierungsvorschläge.
Als Endziel soll eine Funktionssammlung herauskommen, mit der man Enigma basierende Receiver über das WEBIF steuern kann.
Die würde ich dann auch zur Verfügung stellen.

Als ersten Test fange ich mal mit dem Ausschalten an.

Ich habe mir ein Dummymodul mit dem Namen der Dreambox angelegt.
Darunter habe ich zur Zeit 2 Variablen angelegt.
Boolean Available
String IP

Available steuere ich über ein Ping Script.

Was mich wundert ist das es scheinbar keine Instanz für PC/Netzwerkgeräte gibt, welche als Statusvariablen (Available, IP, snmp usw.) haben.

Doch nun zum Auschaltscript :

 
<?

function SetPowerState($obj, $powerstate)
{
 /**
http://dreambox/web/powerstate?newstate={powerstate_number}
0 = Standby
1 = Deepstandby
2 = Reboot
3 = Restart Enigma2
116 = Wake-up (aus Standby --> issued as a "remotecontrol" command)
**/
	$ip = GetIpFromObj($obj);
	$available = GetAvailableFromObj($obj);
	
	if ($ip > '' && $available ) {
		return file_get_contents("http://$ip/web/powerstate?newstate=$powerstate");
	}
}
function GetIpFromObj($obj)
{

	$ip_obj = @IPS_GetObjectIDByName("IP", $obj); // Hole das Object aus Variable IP

	$ip_adr = GetValue($ip_obj);
echo "IP : $ip_adr 
";
return $ip_adr;
}
function GetAvailableFromObj($obj)
{

	$av_obj = @IPS_GetObjectIDByName("Available", $obj); // Hole das Object aus Variable Available

	$available = GetValueBoolean($av_obj);
	echo "Available : $available 
";

return $av_obj;
}
// Test
$dreamboxObj = 31414 /*[Netz Geräte\Dreambox 8000]*/ ;
$aus = 0;
SetPowerState($dreamboxObj, $aus);




?>

Mache ich das vom Ansatz richtig ?.
Wo legt man in IPS solche Funktionen ab, um diese mit ‚include‘ in andere Script zu importieren ?.

Sieht doch ganz gut aus.:slight_smile:

Wo legt man in IPS solche Funktionen ab, um diese mit ‚include‘ in andere Script zu importieren ?.

Lege Dir einfach ein Script glob_fct.php an und include dieses in allen Scripten wo Du es brauchst.

Hallo,
anbei die ersten Funktionen.

Senderlisten abgefragen
Nachrichten auf den Bildschirm senden
Auf aktive Antwort warten

(Benutze ich um festzustellen ob meine Frau wieder mal vorm Fernseher eingeschlafen ist, danach fahre ich den Receiver runter und schalte die Steckdosen aus).

Receiver in Standby oder Deepstandbay fahren

Morgen kommen dann noch die Funktionen für die Lautstärkeregelung,
damit man zb. bei Anrufen die Lautstärke regeln kann.

enigma2_fct.php


<?
/*
* Holt IPAdresse aus Variable 'IP' eines DummyModules obj
*/
function GetIpFromObj($obj)
{

	$ip_obj = @IPS_GetObjectIDByName("IP", $obj); // Hole das Object aus Variable IP
	$ip_adr = @GetValue($ip_obj);

return $ip_adr;
}
/**
*  Prüft über Ping ob Gerät erreichbar
*  Return
*  true  -  wenn erreichbar
*  false -  nicht erreichbar
**/
function ENIGMA2_GetAvailable($ipadr)
{
	$result = false;
   if ($ipadr > "" )
	{
   	$result = (Boolean) Sys_Ping($ipadr, 1000);   // Ping max. 1 Sek. warten
   }
return $result;
}


/**
* Setzt Dreambox in Standby/nicht StandBy
*  -1    -  bei Fehler
*  1  -  wenn in StandBy
*  0 -  wenn nicht in Standby
**/
function ENIGMA2_ToggleStandby($ipadr)
{
	$powerstate = 0;
	$result = -1;

   if (ENIGMA2_GetAvailable( $ipadr ))
	{
   	$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/powerstate?newstate=$powerstate"));
		print_r ($xmlResult);
		if ($xmlResult->e2instandby == 'true')
		{
		   $result = 1;
		}
		else
		{
		    $result = 0;
		}
   }

return $result;
}
/**
* true - wenn ok
*/
function ENIGMA2_DeepStandby($ipadr)
{
	$powerstate = 1;
	$result = false;

   if (ENIGMA2_GetAvailable( $ipadr ))
	{
   	$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/powerstate?newstate=$powerstate"));
	   print_r($xmlResult);
		$result = (Boolean)$xmlResult->e2instandby;
   }

return $result;
}
/**
* true - wenn ok
*/
function ENIGMA2_Reboot($ipadr)
{
	$powerstate = 2;
	$result = false;

   if (ENIGMA2_GetAvailable( $ipadr ))
	{
   	$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/powerstate?newstate=$powerstate"));
   	$result = (Boolean)$xmlResult->e2instandby;
   }

return $result;
}
/**
* true - wenn ok
*/
function ENIGMA2_RestartEnigma($ipadr)
{
	$powerstate = 3;
	$result = false;

   if (ENIGMA2_GetAvailable( $ipadr ))
	{
   	$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/powerstate?newstate=$powerstate"));
   	$result = (Boolean)$xmlResult->e2instandby;
   }

return $result;
}
/**
* liefert den Namen des aktuellen Sendernamens
*/
function ENIGMA2_GetCurrentServiceName($ipadr)
{


   if (ENIGMA2_GetAvailable( $ipadr ))
	{
   	$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/subservices"));
   	$result = $xmlResult->e2service[0]->e2servicename;
   }

return $result;
}
/**
* liefert den Namen der aktuellen Servicereferenz
*/
function ENIGMA2_GetCurrentServiceReference($ipadr)
{


   if (ENIGMA2_GetAvailable( $ipadr ))
	{
   	$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/subservices"));
   	$result = $xmlResult->e2service[0]->e2servicereference;
   }

return $result;
}


/**
* liefert ein Array mit den Namen der Bouquets wenn $bouquet = ""
* liefert ein Array mit den Namen der Sender eines Bouquet  wenn $bouquet ungleich ""
* keys e2servicereference
* keys e2servicename
*/
function ENIGMA2_GetServiceBouquetsOrServices($ipadr,$bouquet = "")
{
   if (ENIGMA2_GetAvailable( $ipadr ))
	{
	   if ($bouquet == "" )
	   {
   		$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/getservices"));
   	}
   	else {
   	   $bouquet = urlencode($bouquet);
   		$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/getservices?sRef=$bouquet"));
   	}
   }
   else
	{
      $xmlResult[] = "";
	}
return $xmlResult;
}
/*
* Schreibt eine Infomessage auf den Bildschirm
* return
* true wenn erfolgreich
* false wenn nicht erfolgreich
**/
function ENIGMA2_WriteInfoMessage($ipadr,$message = "",$time=5)
{
	$type = 1;
	$result = false;
   if (ENIGMA2_GetAvailable( $ipadr ))
	{
	   $message = urlencode($message);
	   $xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/message?text=$message&type=$type&timeout=$time"));
      if ($xmlResult->e2state == "True")
      {
         $result = true;
		}
	}
   else
	{
       $result = false;
	}
return $result;
}
/*
* Schreibt eine Errormessage auf den Bildschirm
* return
* true wenn erfolgreich
* false wenn nicht erfolgreich
**/
function ENIGMA2_WriteErrorMessage($ipadr,$message = "",$time=5)
{
	$type = 3;
	$result = false;
   if (ENIGMA2_GetAvailable( $ipadr ))
	{
	   $message = urlencode($message);
	   $xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/message?text=$message&type=$type&timeout=$time"));
      if ($xmlResult->e2state == "True")
      {
         $result = true;
		}
	}
   else
	{
       $result = false;
	}
return $result;
}
/*
* Schreibt eine Message auf den Bildschirm
* return
* true wenn erfolgreich
* false wenn nicht erfolgreich
**/
function ENIGMA2_WriteMessage($ipadr,$message = "",$time=5)
{
	$type = 2;
	$result = false;
   if (ENIGMA2_GetAvailable( $ipadr ))
	{
	   $message = urlencode($message);
	   $xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/message?text=$message&type=$type&timeout=$time"));
      if ($xmlResult->e2state == "True")
      {
         $result = true;
		}
	}
   else
	{
       $result = false;
	}
return $result;
}
/*
* Schreibt eine Message auf den Bildschirm die man mit ja oder nein beantworten muss
* man sollte die Frage immer so stellen, das nein als aktive Antwort ausgewertet wird,
* da in allen anderen Fällen 0 oder -1  gemeldet wird
* return
* -1  wenn keine erfolgreiche Verbindung
* 0 wenn mit ja oder garnicht geantwortet wurde
* 1 wenn mit nein geantwortet
**/
function ENIGMA2_GetAnswerFromMessage($ipadr,$message = "",$time=5)
{
	$type = 0;
	$result = -1;
   if (ENIGMA2_GetAvailable( $ipadr ))
	{
	   $message = urlencode($message);
	   $xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/message?text=$message&type=$type&timeout=$time"));
      if ($xmlResult->e2state == "True")
      {
         sleep($time);
         $result = -1;
         $xmlResult =  new SimpleXMLElement(file_get_contents("http://$ipadr/web/messageanswer?getanswer=now"));
			if ($xmlResult->e2statetext == "Answer is NO!")
      	{
      		$result = 1;
      	}
      	else
      	{
      	   $result = 0;
      	}
		}
	}
   else
	{
       $result = -1;
	}
return $result;
}

?>

Testprogramm für die Funktionen


<?
include "enigma2_fct" ;
// Test
$dreamboxIP = GetIpFromObj(31414  /*[Netz Geräte\Dreambox 8000]*/);


//$result = ENIGMA2_DeepStandby($dreambox);
//echo "Result.... $result";

echo "$dreamboxIP 
";

$servicename =  ENIGMA2_GetCurrentServiceName($dreamboxIP);
$serviceref =   ENIGMA2_GetCurrentServiceReference($dreamboxIP);
echo "$servicename 
";
echo "$serviceref 
";


$liste = ENIGMA2_GetServiceBouquetsOrServices($dreamboxIP,"");

foreach ($liste as $bouquet)
{
	
	echo "$bouquet->e2servicename 
";
	echo "$bouquet->e2servicereference 
";
}

//Nun für leztes bouquet mal die Sender ausgeben
echo "Sender von $bouquet->e2servicereference 
";
$liste = ENIGMA2_GetServiceBouquetsOrServices($dreamboxIP,$bouquet->e2servicereference);
foreach ($liste as $bouquet)
{

	echo "$bouquet->e2servicename 
";
	echo "$bouquet->e2servicereference 
";
}
/*
$result = ENIGMA2_WriteInfoMessage($dreamboxIP,"Dies ist ein Infotest",10);
if ($result)
{
	echo "Übertragung OK";
}
else
{
	echo "Übertragung nicht OK";
}

$result = ENIGMA2_WriteErrorMessage($dreamboxIP,"Dies ist ein Infotest",10);
if ($result)
{
	echo "Übertragung OK";
}
else
{
	echo "Übertragung nicht OK";
}

$result = ENIGMA2_WriteMessage($dreamboxIP,"Dies ist ein Infotest",10);
if ($result)
{
	echo "Übertragung OK";
}
else
{
	echo "Übertragung nicht OK";
}
*/
$result = ENIGMA2_GetAnswerFromMessage($dreamboxIP,"Soll die Box ausgeschaltet werden",10);
if ($result == 0 || $result == -1)
{
	echo "Benutzer hat mit Ja oder keine Taste gedrückt";
}
else
{
	echo "Benutzer hat mit aktiv mit nein geantwortet";
}


?>

ich hab die DM7000 leider funktionieren Deine Scripts damit nicht, gibt es da auch eine lösung?

Hast du das Enigma2 Image drauf und Webif Plugin installiert dann sollte es auch gehen.
Hab zwar eine DM8000 mit Enigma2 GP bei mir geht das

schmiddi

Hab da ein Problem mit dem Rückgabewert

$result = (Boolean)$xmlResult->e2instandby;

der gibt immer 1 zurück.
Wenn ich den rückgabewert in String zerlege dann bekomme ich z.b. true+2 leerzeichen.
Muss man den rückgabewert irgendwie noch umwandeln bin in XML keine Leuchte
danke
schmiddi

Auf der DM7000 hab ich das Gemini Image mit Enigma 1, gibt es überhaupt Enigma 2 für die 7000er?

Habe gerade geschaut anscheinend gibt es für diese box Enigma2 nicht

aber es gibt eine andere api

hier der link
Ehttp api doku - TuxboxWIKI

must nur mal einen befehl im Browser eingeben
z.B. http://dbox/cgi-bin/audio?volume=30
bei dbox die Ip deiner Box
Der befehl sollte die Lautstärke änder
Kanns leider nicht Testen kein Enigma

schmiddi

danke, über den Browser funktioniert das Ausschalten der Box, wie kann ich in jetzt den befehl an die Box senden?

bitte eine Codezeile als Beispiel
in etwa so:

Sende("http://root:dreambox@192.168.0.17/cgi-bin/admin?command=shutdown")

Du must einfach die Funktionen von belmondo2001 anpassen
Orginal Funktion

function ENIGMA2_ToggleStandby($ipadr)
{
    $powerstate = 0;
    $result = -1;

   if (ENIGMA2_GetAvailable( $ipadr ))
    {
       $xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/powerstate?newstate=$powerstate"));
        print_r ($xmlResult);
     }
}

das ist ein beispiel das normal in PHP laufen sollte (keine Funktion)

$xmlResult = new SimpleXMLElement(file_get_contents("http://192.168.0.17/cgi-bin/admin?command=shutdown"));

gruß
schmiddi

Hallo schmiddi
ausschalten funktioniert aber bekomme dann diese Fehler:


Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : AttValue: " or ' expected in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]: <html><META http-equiv=Content-Type content="text/html; charset=UTF-8"> in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]:                        ^ in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : attributes construct error in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]: <html><META http-equiv=Content-Type content="text/html; charset=UTF-8"> in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]:                        ^ in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Couldn't find end of Start Tag META line 1 in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]: <html><META http-equiv=Content-Type content="text/html; charset=UTF-8"> in C:\IP-Symcon\scripts\42014.ips.php on line 7

Warning:  SimpleXMLElement::__construct() [simplexmlelement.--construct]:                        ^ in C:\IP-Symcon\scripts\42014.ips.php on line 7

Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\IP-Symcon\scripts\42014.ips.php:7
Stack trace:
#0 C:\IP-Symcon\scripts\42014.ips.php(7): SimpleXMLElement->__construct('<html><META htt...')
#1 {main}
  thrown in C:\IP-Symcon\scripts\42014.ips.php on line 7

Das geht anscheinend mit SimpleXMLElement das es über cgi Dateien geht

Versuch mal mit fopen

$handle = fopen ("http://192.168.0.17/cgi-bin/admin?command=shutdown", "r");

Gruß
schmiddi

Hi,

hat sich schon jemand mit anderen Funktionen beschäftigt?

Ich habe eine 800HD hier rumstehen und überlege, ob ich darüber nicht auch die Musik abspielen lassen sollte? Gibt es eine Möglichkeit Radiosender per Webinterface einzustellen, oder Playlists (mit MP3-Files von einer NAS-Festplatte) abzuspielen?

Probleme habe ich im Augenblick, aufgenommene Filme abzuspielen. Der Mediaplayer bleibt bei mir schwarz (über die Fernbedienung klappt es mit dem File). Lieber wäre es mir auch, wenn ich die Dateien per Dateimanager starten könnte, da ich mit dem Mediaplayer immer wieder mal Probleme habe. Nur wie läßt sich der Dateimanager per Web steuern?

Ich bin grad dabei da was zu stricken was möglichst komfortabel und einfach aus IPS anzusprechen ist. Aber ich musste feststellen, dass meine dafür vorgesehene DBox sich zu sehr von der dreambox unterscheidet so dass ich mir erst eine Dreambox zulegen muss. Und dann lass ichs richtig krachen. :smiley:

Die Ergebnisse stelle ich dann natürlich der Öffendlichkeit zu Verfügung.

Toni

Hi,

dann versuche eine 500HD zu bekommen (wird es aber wohl nicht gebarucht geben). Die Dreambox braucht mal endlich nicht so viel Energie (vor allem wenn die Box im Standby ist).

Hast Du denn Infos über das Webinterface der Dreambox? Ich hatte schon mal nach dem Webverzeichnis der Box gesucht, aber nichts gefunden. Unter var und auch usr habe ich zwar ein www-Verzeichnis, hier liegen aber nicht die Webseiten der Dreambox.

Hier mal eine Seite mit den wichtigsten Befehlen zu Enigma2.

Enigma2:WebInterface

Bastel selbst gerade an den Funktionen von belmondo2001 rum.
Thema „Timer“ auslesen, usw.

lg Marco
Dreambox 7025 Besitzer

Hallo,
was würdet Ihr von einem Plugin halten mit dem man IPS
steuern kann. Es gibt schon sowas für EIB. Müsste man eigentlich
nur :smiley: noch auf die IPS Webserviceschnittstelle anpassen.

Rolläden und Beleuchtung über die Dreambox steuern wäre doch auch ganz nett.
Dann muss man sich gar nicht mehr bewegen.

Hat schon mal jemand auf der Dreambox mit Soap und Python gearbeitet.
Bräuchte mal ein Beispiel.

mfg.
Jürgen

Das Webinterface ist ja gut dokumentiert. Aber mir schwebt schon mehr vor als eine einfache Fernbedienung. Den umgekehrten Weg schau ich mir dann an. Reizt mich aber iwi momentan nicht so.

Ne HD Box? Hm… Brauch kein HD und will das eigentlich auch nicht extra löhnen. Wenns nach mir ginge würd ich meine DBox verwenden. Aber der Nutzen für die Community wär wohl eher gering. Aber „nur“ um der Community was gutes zu tun geb ich keine 300 Euro aus. Zumal ich auch auf MediaPortal setzen werd und die Box nur nebenbei werkeln soll. :rolleyes:

Irgendwie müsst ich dazwischen ne „Marktlücke“ finden. :smiley:

Toni

Morgen!

Ich hab mich die letzten Tage mit den Timern beschäftigt und ein paar zusätzliche Funktionen geschrieben, die auf den Code von belmondo aufsetzen.

Die benutze ich zum zeitgesteuerten runterfahren der Box, wenn noch ein Timer aktiv ist, bleibt die Box oben.

// prüft ob ein Timer aktiv ist und liefert true wenn aktiv, sonst false
function ENIGMA2_IsTimerActive($ipadr)
{
   if (ENIGMA2_GetAvailable($ipadr))
	{
		$site = file_get_contents("http://$ipadr/web/timerlist");

		$xmlResult = new SimpleXMLElement($site);
		// e2state = 0 -> geplanter Timer
		// e2state = 2 -> Timer läuft
		// e2state = 3 -> Timer beendet

		// Lese alle Timerevents aus
		foreach ($xmlResult as $child)
		{
				if($child->e2state == "2")          // Aufnahme läuft
				   return true;
				else
				   return false;
		}
	}
	else
	   return false;
}
// Lese alle Timerevents aus, Format DD.MM.YYYY, Uhrzeit (HH:MM:SS), Name der Sendung
// Array mit den Daten = String
function ENIGMA2_GetTimerList($ipadr)
{

	if (ENIGMA2_GetAvailable( $ipadr ))
	{
	   $i = 0;
		$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/timerlist"));
		foreach ($xmlResult as $child)
		{
		      if( $child->e2state == "0")      // geplanter Timer !
		      {
					$data[$i] = date("d.m.Y, H:i:s" , (int)$child->e2timebegin). ", 			" .$child->e2name;
					$i = $i + 1;
				}
		}
   }
   return $data;
}
// löscht bereits abgearbeitete Timer aus der Liste
function ENIGMA2_DeleteTimer($ipadr)
{
	if (ENIGMA2_GetAvailable( $ipadr ))
	{
		$xmlResult = new SimpleXMLElement(file_get_contents("http://$ipadr/web/timercleanup?cleanup="));
   }

}
// liest den noch vorhandenen Festplattenplatz der Box aus
// Rückgabewert = String (xxx.xxx GB)
function ENIGMA2_GetSpaceInfo($ipadr)
{
   if (ENIGMA2_GetAvailable($ipadr))
	{
		$xmlResult =  new SimpleXMLElement(file_get_contents("http://$ipadr/web/about"));
		
		$value = $xmlResult->e2about->e2hddinfo->free;
	}
	return $value;
}

Benutzt wird das so:

// Liste aller Boxen
$List_Dreamboxes = array(DREAMBOX_DREAMBOX_WZ);

foreach($List_Dreamboxes as $box)
{
	// IP-Adresse auslesen
	$ipadr = GetIpFromObj($box);
	// Ist die Box online?
   $value = ENIGMA2_GetAvailable($ipadr);
   SetValue( GetStatusIDFromObj($box), $value);
   
   // ist ein Timer aktiv
   $value = ENIGMA2_IsTimerActive($ipadr);
   SetValue( GetTimerIDFromObj($box), $value);
   
   // Timerliste auslesen
   $value = ENIGMA2_GetTimerList($ipadr);
   $anz = count($value);
   $oldvalue = "";
   for($i = 0; $i < $anz; $i++)
   {
      $oldvalue = $oldvalue . $value[$i] . "
";
	}
	SetValue( GetTimerListIDFromObj($box), $oldvalue);
	
	// Festplattenplatz auslesen
	$value = (string)ENIGMA2_GetSpaceInfo($ipadr);
   SetValue( GetSpeicherplatzIDFromObj($box), $value);
}

Grüße aus dem winterlichen Linz
Marco

Hat schon mal jemand rausgefunden wie ich anzeigen lassen kann was am aktuell eingestellten Sender läuft? Ich finde schon auf der Box den richtigen Link nicht dafür… :confused: