IPS per VDR Steuern

Hallo,

nachdem ich zum Thema VDR noch nicht allzuviel hier im Forum gefunden
habe, dachte ich das interessiert vielleicht den einen oder anderen.
Habe eine PHP Klasse gefunden, mit der man vom Fernseher aus IPS ansteuern und Ausgaben von IPS am Fernseher anzeigen kann.

Svdrp-php - VDR Wiki

Ciao
Severin

svdrp_class.php.txt (8.67 KB)

Hallo Severin,
ich hab nur kurz nen Blick in die Klasse geworfen und sehe jetzt nicht, wie du damit vom VDR aus IPS steuern willst. So wie ich es sehe, ermöglicht die Klasse das Fernsteuern des VDR durch IPS.

Gruß
Dieter

genau so kenne ich es auch:
z.Bsp vdrremote macht es so :
vdr_remote

nichts desto weniger trotz ist es nicht schlecht ggf. vom IPS aus den VDR zu bedienen.

Vom VDR aus ist es sicherlich möglich das IPS zu steuern ggf. über:

hab da kleinen Trick angewandt.
Kopier das auszuführende Script in einen Webserver von IPS
und starte dieses per Command im VDR.

ich als programmier untauglicher hab mal etwas gespielt :


<?

//Nachrichten an das VDR schicken
include("svdrp.class.php");

$VDR = new SVDRP();
$VDR->Connect();
$VDR->Message ("Hallo IPS");

?>

So könnten Meldungen aus dem IPS am VDR angezeigt werden.

Hier ein Beispiel wie die Klasse anzuwenden ist.


include "svdrp_class.ips.php";
echo "<pr"."e>";
$a = new SVDRP();
$a->Connect();
print_r($a->Help());
print_r($a->ListChannels());
$a->GetKeys();
print_r($a->GetVolume());
print_r($a->GetDiskStat());
$a->Disconnect();

Um z.B. eine Steckdose über den VDR einzuschalten, dieses Script unter dem Namen „Steckdose.ips.php“ in den Webserver legen:


<?
FS20_SwitchMode(28909, TRUE);
?>

Und im VDR unter Commands.conf


wget --spider -q  http://192.168.0.6:89/Steckdose.ips.php

cool …
Danke für die Information … werde ich gleich mal versuchen.

Hallo zusammen

Seit dem update auf IPS 2.5 funktioniert die Kommunikation mit dem VDR nicht mehr.

Erst kam ein „Call-time pass-by-reference has been removed“ Fehler in der SVDRP_class.php. Den hab ich aber noch hinbekommen.
Jetzt kommt aber ein "Fatal Error Cannot pass parameter 1 by reference in … " in dieser Zeile

 $this->DebugMessage("handle: $this->handle<br>
");

Daran scheitere ich jetzt leider. hoffe es kann mir jemand n Tipp geben was ich da ändern muss.

Gruß Jannis

Ich hab den Code zwar nicht am Laufen, aber ich würd mal folgendes vorschlagen:


$this->DebugMessage('handle: '.$this->handle."<br>
");  

Hallo

Das wars leider nicht. Gibt immer noch den gleichen Fehler aus

Fatal error: Cannot pass parameter 1 by reference in C:\Programme\IPS2\scripts\svdrp_class.php on line 40

Schade.

Poste doch mal Dein komplettes Script

es ist das svdrp_class script aus dem ersten Beitrag
Audgrufen wird es durch

include(IPS_GetKernelDir()."scripts\svdrp_class.php");

$VDR = new SVDRP();
$VDR->Connect();
$VDR->Message ($msg);
$VDR->Disconnect();
}

… auch das svdrp_class.php - dort hast Du ja laut Post 1 bereits eine Änderung gemacht

So hab den Fehler gefunden. Ich hab ein paar & zu viele in dem svdrp_class Script eingefügt.

Hier mal das funktionierende Script für IPS 2.5

Ich hab nur Message, Lauter, Leiser und Aufnahmen anzeigen ausprobiert.
Wenn noch jemand einen Fehler findet dann einfach kurz mitteilen.

Danke für eure mithilfe.

<?php

// SVDRP is a class do communicate with a vdr via svdrp
class SVDRP
{
	var $cfgServer;
	var $cfgPort;
	var $cfgTimeOut;

	var $handle;
	var $debug;

	function SVDRP($server = "192.168.178.26", $port=2001, $timeout = 30, $debug = 0)
	{
		$this->cfgServer = $server;
		$this->cfgPort = $port;
		$this->cfgTimeOut = $timeout;
		$this->debug = $debug;
		$this->handle = 0;
	}

	function DebugMessage($msg)
	{
		if($this->debug) echo ($msg);
	}

	function Connect()
	{
		if($this->handle) Disconnect();
		$errno = 0;
		$errstr = "";
		$this->handle = fsockopen($this->cfgServer, $this->cfgPort, $errno, $errstr, $this->cfgTimeOut);

		if(!$this->handle)
		{
			$this->DebugMessage("error $errno: $errstr");
			return false;
		}
		
		$this->DebugMessage('handle: '.$this->handle.'<br>
');

		 

		$input = fgets($this->handle,128);

		if(!preg_match("/^220 /", $input) || $input == "")
		{
			$this->DebugMessage("wrong welcome message: '$input'<br>
");
			$this->Disconnect();
			return false;
		}


		$this->DebugMessage("Welcome message: $input<br><br>
");

		return true;
	}

	function Command($cmd)
	{
		if(!$this->handle) return false;

		$ret = array();

		$this->DebugMessage("Kommando $cmd<br><pr"."e>");
		fputs($this->handle, $cmd . "
");
		$s = "";
		$nline = 0;
		while($s .= fgets($this->handle,2048))
		{
			$nline++;

                         $this->DebugMessage($s);
			 if(!preg_match("/^(\\d{3})([ -])(.*)$/", $s, $data))
			 {
			 	continue;
			 }




			 $number = $data[1];
			 // TODO: Fehlernummer bearbeiten
			 $ret[] = $data[3];
			 if($data[2] != "-" && $nline == 1) $ret =  $data[3] ;
 			 if($data[2] != "-") break;
			 $s = "";

		}

		$this->DebugMessage("</pr"."e>");
		return $ret;
	}

	function ListChannels($numberorname="")
	{
		if(!$this->handle) return false;
		$channels = array();
		$lines = $this->Command("LSTC$numberorname");
		if(!$lines) return false;
		foreach($lines as $a => $l)
		{
			$a = preg_split(":", $l);
			$name = $a[0];
			$freq = $a[1];
			$b = preg_split(";", $name);
			$name = $b[0];
			if(!isset($b[1])) $b[1] = $name;
			$group = $b[1];


			$c["name"] = $name;
			$c["group"] = $group;
			$c["frequency"] = $freq;

			$channels[] = $c;


		}
		return $channels;
	}

	function Help()
	{
		return $this->Command("HELP");
	}
	function Disconnect()
	{
		if(!$this->handle) return;
		$this->Command("QUIT");

		fclose($this->handle);
		$this->handle = 0;
		$this->DebugMessage("disconnected");
	}
	function ClearEpg()
	{
		if(!$this->handle) return false;
		$this->Command("CLRE");
		return true;
	}
	function SwitchUp()
	{
		if(!$this->handle) return false;
		$this->Command("CHAN +");
		return true;
	}
	function SwitchDown()
	{
		if(!$this->handle) return false;
		$this->Command("CHAN -");
		return true;
	}
	function SwitchChannel($channel)
	{
		if(!$this->handle) return false;
		$this->Command("CHAN $channel");
		return true;
	}
	function DeleteChannel($id)
	{
		if(!$this->handle) return false;
		$this->Command("DELC $id");
		return true;
	}
	function DeleteRecord($id)
	{
		if(!$this->handle) return false;
		$this->Command("DELR $id");
		return true;
	}

	function GrabImage($filename, $type="jpeg", $quality="", $width="", $height)
	{
		if(!$this->handle) return false;
		$this->Command("GRAB $filename $type $quality $width $height");
		return true;
	}
	function HitKey($key)
	{
		if(!$this->handle) return false;
		$this->Command("HITK $key");
		return true;
	}
	function PowerOff()
	{
		if(!$this->handle) return false;
		$this->Command("HITK Power");
		return true;

	}
	function GetKeys()
	{
		if(!$this->handle) return false;

		$lines = $this->Command("HITK");
		$keys = array();
		foreach($lines as $l)
		{
			if(!preg_match("/^ {4}(.*)$/", $l, $m)) continue;
			$keys[] = $m[1];
		}

		return $keys;
	}
	function ListEPG($pStrChannel="", $pStrTime="")
	{
		if(!$this->handle) return false;
		$lines = $this->Command("LSTE");

		$epg = array ();
		$channel = array();
		$event = array();

		$channelname = "";
		foreach($lines as $l)
		{
			preg_match("/^(.)\\s*(.*)$/", $l, $m);
			$type = $m[1];
			$text = $m[2];
			switch($type)
			{
			case 'C': // Channel
				list( $channeldata, $channelname ) = explode( ' ', $text, 2 );

				break;
			case 'E': // new Event
				sscanf($text, "%u %ld %d %X", $event["EventID"], $event["StartTime"], $event["Duration"], $event["TableID"]);

				break;
			case 'T': // Title
				$event["Title"] = $text;
				break;
			case 'S': // Short text
				$event["Shottext"] = $text;
				break;
			case 'D': // Description
				$event["Desc"] = $text;
				break;
			case 'V': // VPS
				$event["VPS"] = $text;
				break;
			case 'e': // Event end
				if ((trim($pStrTime) != '') && (( $event['StartTime'] > $pStrTime ) || ($event['StartTime'] + $event["Duration"] < $pStrTime)))
					continue;

				$channel[] = $event;
				$event = array();

				break;
			case 'c': // Channel end
				if ((trim($pStrChannel) != '') && ($channelname != $pStrChannel))
					continue;

				$epg[$channelname] = $channel;
				$channel = array();

				break;
			}

		}
		if ((trim($pStrTime) == '') || (( $event['StartTime'] < $pStrTime ) && ($event['StartTime'] + $event["Duration"] > $pStrTime)))
			$channel[] = $event;

		if ((trim($pStrChannel) != '') || ($channelname == $pStrChannel))
			$epg[$channelname] = $channel;

		return $epg;
	}

	function Message($msg)
	{
		if(!$this->handle) return false;
		$this->Command("MESG $msg");
		return true;
	}


	// Volume commands
	function ToggleMute()
	{
		if(!$this->handle) return false;
		$this->Command("VOLU mute");
		return true;
	}
	function VolumeUp()
	{
		if(!$this->handle) return false;
		$this->Command("VOLU +");
		return true;
	}
	function VolumeDown()
	{
		if(!$this->handle) return false;
		$this->Command("VOLU -");
		return true;
	}
	function SetVolume($v)
	{
		if(!$this->handle) return false;
		$this->Command("VOLU $v");
		return true;
	}
	function GetVolume()
	{
		if(!$this->handle) return false;
		$v = $this->Command("VOLU");
		if($v == "Audio is mute") return 0;
		if(!preg_match("/Audio volume is (.*)/", $v, $m)) return false;

		return $m[1];
	}
	function GetDiskStat()
	{
		if(!$this->handle) return false;
		$stat = $this->Command("STAT DISK");
		sscanf($stat, "%dMB %dMB %d%%", $FreeMUsedMB, $FreeMB, $Percent);
		$ret["FreeMB + UsedMB"] = $FreeMUsedMB;
		$ret["FreeMB"] = $FreeMB;
		$ret["UsedMB"] = $FreeMUsedMB - $FreeMB;
		$ret["Percent"] = $Percent;
		return $ret;
	}
	function StartScan()
	{
		if(!$this->handle) return false;
		$this->Command("SCAN");
		return true;
	}
	function MoveChannel(&$number, &$to)
	{
		if(!$this->handle) return false;
		$this->Command("MOVC $number $to");
		return true;

	}

	function DeleteTimer($id)
	{
		if(!$this->handle) return false;
		$this->Command("DELT $id");
		return true;
	}

	function MoveTimer($number, &$to)
	{
		if(!$this->handle) return false;
		$this->Command("MOVT $number $to");
		return true;
	}

	function TimerOnOff($n, $state = "on")
	{
		if(!$this->handle) return false;
		//if($state == "1") $state = "on";
		//if($state == "0") $state = "off";
		//if($state == false) $state = "off";
		// if($state == true) $state = "on";
		switch($state)
		{
		case false:
		case "off":
		case "0":
		$state = "off";
		break;
		default:
		$state = "on";
		break;
		}

		return $this->Command("MODT $n $state");
	}

	function ListTimers()
	{

	}

	function ShowMessage($msg = "")
	{
		if(!$this->handle) return false;
		return $this->Command("MESG $msg");
	}

	function ListRecords()
	{
		if(!$this->handle) return false;

		$lines = $this->Command("LSTR");
		$records = array();
		foreach($lines as $l)
		{

			if(!preg_match("/^(\\d)\s(\\d*)\\.(\\d*)\\.(\\d*) (\\d*)\\:(\\d*).\s(.*)$/", $l, $m)) continue;
			$id = $m[1];
			$m["id"] 		= $m[1];
			$m["day"] 		= $m[2];
			$m["month"] 	= $m[3];
			$m["year"] 		= $m[4];
			$m["hour"] 		= $m[5];
			$m["minute"] 	= $m[6];
			$m["desc"] 		= $m[7];

			$records[$id] = $m;
		}

		return $records;

	}

	// TODO: perhaps better implementation
	function ListRecord(&$n)
	{
		if(!$this->handle) return false;
		$m = $this->Command("LSTR $n");
		return $m[0];
	}



	//TODO: Implement following commands:
	/*


	LSTT    MODT 	NEWT UPDT
	MODC  NEWC
	    NEXT
	PUTE

	*/
}

// Small Example
/*
echo "<pr"."e>";
$a = new SVDRP();
$a->Connect();
print_r($a->Help());
print_r($a->ListChannels());
$a->GetKeys();
print_r($a->GetVolume());
print_r($a->GetDiskStat());
$a->Disconnect();
*/
?>


Gruß Jannis