Nachrichten (PMR), Volume (DMR) und RC-Commandos per LAN an Samsung TV C-Serie

Nachdem ich nun schon lange an einer Einbindung meinen C-Serie TV inkl versenden von Benachrichtigung an den TV gearbeitet habe, möchte ich euch das Herzstück meiner Bastelstunde nicht vorenthalten.
Mit welchen Geräten/Serien das Script arbeitet kann ich nicht sagen, da ich nur einen TV zum testen habe.
Die Fähigkeiten können z.B. mit dem ruSamsungTVCommunicator ermittelt werden.

Hier im Forum gibt es ja schon ein Script welches RC-Commandos per LAN versenden kann, dieses habe ich hier auch mit eingebaut und auf die Verwendung einen IPS-ClientSocket verzichtet.
Mein Gerät unterstützt außerdem per DMR (Digital-Media-Render / DLNA) das setzen und Abfragen der Lautstärke. Sowie per PMR (Personal-Message-Receiver) das empfangen und Anzeigen von Nachrichten.

Teilweise ist das ganze noch etwas umständlich und auch nicht zu 100% perfekt, so wird die Rückmeldung des TV bei RC-Commandos nicht ausgewertet.
Und da ich einfach keine Zeit/Lust hatte mich in die Verwendung von SOAP in PHP einzuarbeiten, werden die Datenpakete zu Fuß erzeugt und versendet. (Wer möchte kann das für die DMR und PMR Funktionen gerne einbauen.)
Ebenso scheiterte ich am abonnieren von DLNA-Events vom TV, welches z.B. das zykliche Abfragen der Lautstärke überflüssig machen würde.

Somit stellt nachfolgendes Script nur das Gerüst mit entsprechenden Funktionen dar, Variablen, Scripte für Steuerungen z.B. per WebFront oder per Events etc… müßt Ihr selber anlegen.

Doku:

1 ) Verwendung:

Diese Doku zeigt die Verwendung der beiliegenden Samsung.inc.php auf, welche
es ermöglicht relativ komfortabel an Samsung-Geräten (TV, BD …)
Fernbedienung-Kommandos und Nachrichten (PMR / DMR) zu senden.
Fehlermeldungen aufgrund von nicht erreichbaren Geräten bzw. fehlerhafter Übertragung etc.
werden unterdrückt. Hierfür stehen Rückgabewerte zur Verfügung.
Fehler durch nicht / falsch übergebene Parameter werden nicht unterdrückt und die
Daten / Parameter werden auch nicht verifiziert.

Script Samsung.inc.php innerhalb von IPS oder dessen Script-Ordner anlegen.
Einbindung z.B. mit

require_once("Samsung.inc.php");

2) Konfiguration

In der Samsung.inc.php sind die Konstanten und Variablen anzupassen !
Pro Gerät gibt es ein Array welches in $samy abgelegt wird.
Um bei den Funktionen nicht immer mit den IDs der $samy-Variable zu arbeiten,
wurden noch Konstanten (z.B. SamyTV, SamyBD) definiert.

Die Fähigkeiten des Gerätes vorher bitte mit dem ruSamsungTVCommunicator
ermitteln und einen Probelauf durchzuführen. Hiermit können auch die
u.U. abweichenden Ports festgestellt werden.

3) Vorbemerkungen zur PWR_VARID

Bevor Ihr beginnt:
Die in der Konfiguration anzugeben PWR_VARID ist eine bool-Var welche den
Zustand Ein/Aus des Gerätes wiederspiegelt.
Sie wird durch dieses Script nicht erzeugt !
Außerdem wird Sie erst aktualisiert, wenn ein Kommando ausgeführt wird.
Dabei wird geprüft ob das Gerät erreichbar ist und die Variable nachgeführt.

Da die Geräte nicht über das Netzwerk eingeschaltet werden können,
müßt Ihr ein eigenes Script mit eigener Hardware (z.B. WinLIRC /
CEC-Befehl eines Verstärkers / etc… ) nutzen um die Geräte einzuschalten.
Dabei könnt Ihr dann auch gleich die PWR_VARID auf true (also Gerät eingeschaltet)
setzen.

Mögliche Vorgehensweise um die PWR_VARID aktuell zu halten:
Prüfe ob LAN-Port des Gerätes UP/Down ist (Switch per SNMP anfragen).
Prüfe ob Fritz-Box meldet Gerät ist an (http://fritz.box/net/network_user_devices.lua auswerten)
Alle x sekunden Gerät versuchen anzupingen.
… Laßt auch was einfallen :smiley:

4) Vorbemerkungen zur COM_ERROR_VARID

Da ich zyklisch die Lautstärke vom TV abfrage, kommt es oft zu Fehlern, wenn der TV schon aus
ist (per Hand ausgeschaltet) und IPS das somit nicht weiß. Darum führe ich einen Zähler in diesem
Script mit, welches bei >= 5 Fehlversuchen die PWR_VARID auf false setzt.
Außerdem wird der Kommunikationsfehler nicht ausgewertet, wenn das Versenden einer
SOAP-Nachricht (DMR / PMR) den Fehler 10061 bringt, weil dieser auftritt wenn ein Verstärker die
Audioausgabe übernimmt.

5) Funktionsreferenz


**** variant SAMY_SendControl(int $Command, int [$Data],int [$Device]); ****


Sendet einen Befehl an den DMR (Digital Media Render) des Gerätes.
Funktioniert nicht wenn Audio über einen angeschloßenen Verstärker wiedergegeben wird !

$Command:
SAMSUNG_CONTROL_SETVOLUME = Lautstärke setzen
SAMSUNG_CONTROL_GETVOLUME = Lautstärke lesen
SAMSUNG_CONTROL_SETMUTE = Mute / Unmute setzen
SAMSUNG_CONTROL_GETMUTE = Mute / Unmute lesen

$Data:
Neue Lautstärke bzw. neuer Status für Mute (0 = Unmute / 1 = Mute)
Wird bei SAMSUNG_CONTROL_GET* nicht benötigt, muss aber auch dann mit z.B. 0
übergeben werden, wenn Device übergeben werden soll.

$Device:
Gerät welches angesprochen wird.
Hier können die in der Samsung.inc.php definierten Konstanten (z.B. SamyTV, SamyBD)
verwendet werden. Was den Code lesbarer hält.
Bei nur einem Gerät brauch der Wert nicht übergeben werden.

Rückgabewert:
Bei allen _SET ist es ein bool für Erfolgreich (true) und nicht erfolgreich (false)
Bei allen _GET ist der es Abgefragte Wert bei Erfolg, oder false bei nicht erfolgreich.

Beispiele:
Setze Lautstärke auf 5 von Gerät 0

SendControl(SAMSUNG_CONTROL_SETVOLUME,5);

Lese Lautstärke von Gerät SamyBD

$volume = SendControl(SAMSUNG_CONTROL_GETVOLUME),0,SamyBD;
if ($volume === false) return; // Abbruch bei Fehler
echo ("Volume ist: ".$volume);


** bool SAMY_SendMessage(int $Type, array $Data, int [$Device], string [$Timeout]) **


$Type:
SAMSUNG_MESSAGE_SMS = SMS Nachricht
SAMSUNG_MESSAGE_CALL = Anruf Nachricht
SAMSUNG_MESSAGE_SCHEDULE = Termin Nachricht
SAMSUNG_MESSAGE_REMOVE = Ohne Funktion ! Soll eigentlich eine Nachricht löschen, hat mein TV aber ignoriert.

$Data:
enthält je nach $Type die Darzustellenden Daten als Array

Immer:
$Data['ID']          =  string  Nachrichten-ID (egal)

SAMSUNG_MESSAGE_SMS:
$Data['ReceiveTime'] =  unixtimestamp [optional]
$Data['ToNumber']    =  string  Empfänger-Nummer
$Data['ToName']      =  string  Empfänger-Name
$Data['FromNumber']  =  string  Absender-Nummer
$Data['FromName']    =  string  Absender-Name
$Data['Message']     =  string  Nachrichteninhalt

SAMSUNG_MESSAGE_CALL:
$Data['CallTime'] =  unixtimestamp [optional]
$Data['ToNumber']    =  string  Empfänger-Nummer
$Data['ToName']      =  string  Empfänger-Name
$Data['FromNumber']  =  string  Absender-Nummer
$Data['FromName']    =  string  Absender-Name

SAMSUNG_MESSAGE_SCHEDULE:
$Data['StartTime']   =  unixtimestamp [optional]
$Data['EndTime']     =  unixtimestamp [optional, dann ist Endtime = StartTime + 15 Minuten]
$Data['ToNumber']    =  string  Empfänger-Nummer
$Data['ToName']      =  string  Empfänger-Name
$Data['Location']    =  string  Treffpunkt
    $Data['Subject']    =  string  Betreff
$Data['Message']     =  string  Nachrichteninhalt

$Device:
Gerät welches angesprochen wird.
Hier können die in der Samsung.inc.php definierten Konstanten (z.B. SamyTV, SamyBD)
verwendet werden. Was den Code lesbarer hält.
Bei nur einem Gerät brauch der Wert nicht übergeben werden.

$Timeout:
Anzeigedauer, optional. Standardwert ist ‚Maximum‘

Rückgabewert:
bool: für Erfolgreich (true) und nicht erfolgreich (false)

Beispiele:

if (SendMessage(SAMSUNG_MESSAGE_SMS,$message,SamyTV) === true)
{
	echo "Meldung erfolgreich abgesetzt.";
}else
{
	echo "Meldung konnte nicht abgesetzt werden!";
}


**** bool SAMY_SendRemote(Variant $Key, int [$WaitTime], int [$Device]) ****


$Key:
Key-Code welcher gesendet werden soll als String.
Oder wenn mehrere Tasten hintereinander gesendet werden sollen, als Array welches Strings enthält.
Codes siehe hier:
Key codes - SamyGO
D-Series Key Codes - SamyGO

$WaitTime:
Zeit im ms zwischen den senden der Tasten (optional, Standard = 50 ms)
Ohne Funktion bei einem Key-Code.

$Device:
Gerät welches angesprochen wird.
Hier können die in der Samsung.inc.php definierten Konstanten (z.B. SamyTV, SamyBD)
verwendet werden. Was den Code lesbarer hält.
Bei nur einem Gerät brauch der Wert nicht übergeben werden.

Rückgabewert:
bool: für Erfolgreich (true) und nicht erfolgreich (false)
Bedeute hier aber nur dass der Befehl übertragen wurde!
Nicht ob das Gerät auch die Aktion ausgeführt hat !

Beispiel:

SendRemote("KEY_ENTER");
SendRemote("KEY_POWEROFF",0,SamyBD);
SendRemote(array("KEY_VOLUP","KEY_VOLUP","KEY_VOLUP","KEY_VOLDOWN","KEY_VOLDOWN","KEY_VOLDOWN"),100);

6) Inhalt von Samsung.inc.php

<?
define('SamyTV',0);  /* Device 1 */
define('SamyBD',1);  /* Device 2 */

/* Device 1 */
$samy[0] = array(
"PWR_VARID" => 46005,  // Variable (bool) welche den Status an/aus des Geräte darstellt (Muß von extern gesteuert werden!)
"HOSTADDR" => 'tv.nall-chan.net', // Hostname oder IP-Adresse des Gerätes.
"SOAP_PORT" => 52235,   // Standard C-Serie
"RC_PORT" => 55000,     // Standard C-Serie
"MODELNAME" => "PS50C6970",  // Wichtig für die Remote-Control Funktion.
"COM_ERROR_VARID" => 21366  // Variable (int) Anzahl der Kommunikations-Fehler bei =>5 wird der TV als Aus (PWR_VARID auf false) angezeigt.
);

/* Device 2 */
$samy[1] = array(
"PWR_VARID" => 46005,
"HOSTADDR" => 'tv.nall-chan.net',
"SOAP_PORT" => 52235,
"RC_PORT" => 55000,
"MODELNAME" => "PS50C6970",
"COM_ERROR_VARID" => 21366 
);

/* IPS Daten für Remote Control */
define("SAMSUNG_REMOTE_SOURCE_IP","192.168.XXX.XXX");    // IP-Adresse von IPS
define("SAMSUNG_REMOTE_SOURCE_MAC","0C-0C-0C-0C-0C-0C"); // MAC-Adresse welche registriert werden soll
define("SAMSUNG_REMOTE_NAME","IPS Samsung Remote");      // Name unter welchen IPS in Gerät registriert wird
define("SAMSUNG_REMOTE_APP_NAME","iapp.samsung");        // Scheinbar egal :)

/* Ab hier nichts mehr zu ändern */
//Dokumentation der Funktionen in dem Beispiel-Script

/* PORT zuweisung zum Array */
define("SAMSUNG_SOAP_PORT", "SOAP_PORT");
define("SAMSUNG_REMOTE_PORT", "RC_PORT");

/* PMR Control */
define("SAMSUNG_MESSAGE_SMS",1);
define("SAMSUNG_MESSAGE_CALL",2);
define("SAMSUNG_MESSAGE_SCHEDULE",3);
define("SAMSUNG_MESSAGE_REMOVE",4);

/* DMR Control */
define("SAMSUNG_CONTROL_GETVOLUME",1);
define("SAMSUNG_CONTROL_SETVOLUME",2);
define("SAMSUNG_CONTROL_GETMUTE",3);
define("SAMSUNG_CONTROL_SETMUTE",4);

function SAMY_SendMessage($type,$data,$ID = 0,$timeout='Maximum')
{
	if (!SAMY_CheckTV()) return false;
	switch ($type)
	{
		case SAMSUNG_MESSAGE_SMS:
		if (!isset($data['ReceiveTime'])) $data['ReceiveTime']=time();
		$body='<Category>SMS</Category>
<DisplayType>'.$timeout.'</DisplayType>
<ReceiveTime>
<Date>'.date("Y-m-d",$data['ReceiveTime']).'</Date>
<Time>'.date("H:i:s",$data['ReceiveTime']).'</Time>
</ReceiveTime>
<Receiver>
<Number>'.$data['ToNumber'].'</Number>
<Name>'.$data['ToName'].'</Name>
</Receiver>
<Sender>
<Number>'.$data['FromNumber'].'</Number>
<Name>'.$data['FromName'].'</Name>
</Sender>
<Body>'.$data['Message'].'</Body>';
		break;
		case SAMSUNG_MESSAGE_CALL:
		if (!isset($data['CallTime'])) $data['CallTime']=time();
		$body='<Category>Incoming Call</Category>
<DisplayType>'.$timeout.'</DisplayType>
<CallTime>
<Date>'.date("Y-m-d",$data['CallTime']).'</Date>
<Time>'.date("H:i:s",$data['CallTime']).'</Time>
</CallTime>
<Callee>
<Name>'.$data['ToName'].'</Name>
<Number>'.$data['ToNumber'].'</Number>
</Callee>
<Caller>
<Name>'.$data['FromName'].'</Name>
<Number>'.$data['FromNumber'].'</Number>
</Caller>';
		break;
		case SAMSUNG_MESSAGE_SCHEDULE:
		if (!isset($data['StartTime'])) $data['StartTime']=time();
		if (!isset($data['EndTime'])) $data['EndTime']=time()+(15 * 60); //Ende = Start + 15 Min.
		$body='<Category>Schedule Reminder</Category>
<DisplayType>'.$timeout.'</DisplayType>
<StartTime>
<Date>'.date("Y-m-d",$data['StartTime']).'</Date>
<Time>'.date("H:i:s",$data['StartTime']).'</Time>
</StartTime>
<Owner>
<Number>'.$data['ToNumber'].'</Number>
<Name>'.$data['ToName'].'</Name>
</Owner>
<Subject>'.$data['Subject'].'</Subject>
<EndTime>
<Date>'.date("Y-m-d",$data['EndTime']).'</Date>
<Time>'.date("H:i:s",$data['EndTime']).'</Time>
</EndTime>
<Location>'.$data['Location'].'</Location>
<Body>'.$data['Message'].'</Body>';
		break;
		case SAMSUNG_MESSAGE_REMOVE:
		$body='';
		break;
	}
	if ($type <> SAMSUNG_MESSAGE_REMOVE)
	{
		$message='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
<s:Body>
<u:AddMessage xmlns:u="urn:samsung.com:service:MessageBoxService:1\">
<MessageType>text/xml</MessageType>
<MessageID>'.$data['ID'].'</MessageID>
<Message>
'.htmlspecialchars(utf8_encode($body)).'
</Message>
</u:AddMessage>
</s:Body>
</s:Envelope>';
		$SOAPAction='urn:samsung.com:service:MessageBoxService:1#AddMessage';
	} else {
		$message='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
<s:Body>
<u:RemoveMessage xmlns:u="urn:samsung.com:service:MessageBoxService:1\">
<MessageType>text/xml</MessageType>
<MessageID>'.$data['ID'].'</MessageID>
</u:RemoveMessage>
</s:Body>
</s:Envelope>';
		$SOAPAction='urn:samsung.com:service:MessageBoxService:1#RemoveMessage';
	}

	$packet = SAMY_AddHeaders('/PMR/control/MessageBoxService',$SOAPAction,$message,$ID);
	if (SAMY_CheckResponse(SAMY_SendPacket($packet,$ID))===false) return false;
	return true;
}


function SAMY_SendControl($type,$data = 0,$ID = 0)
{
	if (!SAMY_CheckTV()) return false;
	switch ($type)
	{
		case SAMSUNG_CONTROL_SETVOLUME:
			$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume';
			$body = '<ns0:SetVolume xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
<DesiredVolume>'.$data.'</DesiredVolume>
</ns0:SetVolume>
';
		break;
		case SAMSUNG_CONTROL_GETVOLUME:
			$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetVolume';
			$body = '<ns0:GetVolume xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
</ns0:GetVolume>
';
			$start="<CurrentVolume>";
			$end="<\/CurrentVolume>";

		break;
		case SAMSUNG_CONTROL_GETMUTE:
			$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetMute';
			$body = '<ns0:GetMute xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
</ns0:GetMute>
';
			$start="<CurrentMute>";
			$end="<\/CurrentMute>";
		break;
		case SAMSUNG_CONTROL_SETMUTE:
			$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetMute';
			$body = '<ns0:SetMute xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
<DesiredMute>'.$data.'</DesiredMute>
</ns0:SetMute>
';
		break;
	}

	$message='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
'.$body.'</s:Body>
</s:Envelope>';
	$packet = SAMY_AddHeaders('/upnp/control/RenderingControl1',$SOAPAction,$message,$ID);
	$response =SAMY_SendPacket($packet,$ID);
	if (SAMY_CheckResponse($response)===false)
	{
		if ($response===false) return false;
		$error =SAMY_GetTextBetween($response, "<errorDescription>", "<\/errorDescription>");
		if ($error <> "10061")
		{
	   	IPS_LogMessage("SamsungTV","ErrorNumber: ".$error);
	  	}
	}
	if (isset($start)) return SAMY_GetTextBetween($response, $start, $end);
	return true;
}

function SAMY_AddHeaders($URI, $SOAPAction, $Payload,$ID)
{
global $samy;
return 'POST '.$URI.' HTTP/1.1
Content-Type: text/xml; charset="utf-8"
SOAPACTION: "'.$SOAPAction.'"
Cache-Control: no-cache
Host: '.$samy[$ID]["HOSTADDR"].':'.$samy[$ID]["SOAP_PORT"].'
Content-Length: '.strlen($Payload).'
Connection: Close

'.$Payload;
}


function SAMY_SendPacket($content, $ID, $port = SAMSUNG_SOAP_PORT, $waitforResponse = true)
{
global $samy;
   $fp = @fsockopen ($samy[$ID]["HOSTADDR"], $samy[$ID][$port], $errno, $errstr, 10);
   if (!$fp)
	{
		if ($port == SAMSUNG_REMOTE_PORT) return false;
		if ($errno <> "10061")
		{
   		IPS_LogMessage("SamsungTV","$errstr ($errno)");
		  	SetValueInteger($samy[$ID]["COM_ERROR_VARID"],GetValueInteger($samy[$ID]["COM_ERROR_VARID"])+1);
			return "<errorDescription>".$errno."<\/errorDescription>";
		}
		return false;
   } else {
		if (SAMY_fwrite_stream($fp, $content) === false) return false;
		if (!$waitforResponse) return true;
     	$ret = false;
     	while (!feof($fp))
		{
			$ret.= fgets($fp,128);
		}
		fclose($fp);
   }
 	return $ret;
}

function SAMY_CheckResponse($ret)
{
  	if(!(strpos($ret, "200 OK") === false))
	{
     	return $ret;
   } else {
		return false;
   }

}

function SAMY_GetTextBetween($string, $start, $end){
	if ($string === false) return;
$preg= preg_match_all( "/$start(.*)$end/U", $string, $match );
   return $match[1][0];
}

function SAMY_CheckTV($ID = 0)
{
	global $samy;
	if (IPS_SemaphoreEnter("Samy",100))
	{
		if (GetValueInteger($samy[$ID]["COM_ERROR_VARID"]) >= 5)
		{
		  	SetValueInteger($samy[$ID]["COM_ERROR_VARID"],0);
			SetValueBoolean($samy[$ID]["PWR_VARID"],false);
			IPS_SemaphoreLeave("Samy");
			return false;
		}
		if (GetValueBoolean($samy[$ID]["PWR_VARID"]))
		{
			IPS_SemaphoreLeave("Samy");
			return true;
		}
		if (Sys_Ping($samy[$ID]["HOSTADDR"], 250))
		{
			SetValueBoolean($samy[$ID]["PWR_VARID"],true);
			IPS_SemaphoreLeave("Samy");
			return true;
		}
	  	SetValueInteger($samy[$ID]["COM_ERROR_VARID"],0);
		SetValueBoolean($samy[$ID]["PWR_VARID"],false);
		IPS_SemaphoreLeave("Samy");
		return false;
	 }

}

function SAMY_fwrite_stream($fp, $string) {
    for ($written = 0; $written < strlen($string); $written += $fwrite) {
        $fwrite = @fwrite($fp, substr($string, $written));
        if ($fwrite === false) {
            return false;
        }
    }
    return true;
}


function SAMY_SendRemote($key,$time = 50, $ID = 0) // Auswertung Rückkanal fehlt und senden über Socket
{
	global $samy;

	if (!SAMY_CheckTV()) return false;

	$msg = chr(0x64).chr(0x00).chr(strlen(base64_encode(SAMSUNG_REMOTE_SOURCE_IP))).chr(0x00).base64_encode(SAMSUNG_REMOTE_SOURCE_IP).chr(strlen(base64_encode(SAMSUNG_REMOTE_SOURCE_MAC))).chr(0x00).base64_encode(SAMSUNG_REMOTE_SOURCE_MAC).chr(strlen(base64_encode(SAMSUNG_REMOTE_NAME))).chr(0x00).base64_encode(SAMSUNG_REMOTE_NAME);
	$auth = chr(0x00).chr(strlen(SAMSUNG_REMOTE_APP_NAME)).chr(0x00).SAMSUNG_REMOTE_APP_NAME.chr(strlen($msg)).chr(0x00).$msg;
	if (is_array($key))
	{
		foreach ($key as $single)
		{
			$msg = chr(0x00).chr(0x00).chr(0x00).chr(strlen(base64_encode($single))).chr(0x00).base64_encode($single);
			$pkt = $auth.chr(0x00).chr(strlen($samy[$ID]["MODELNAME"])).chr(0x00).$samy[$ID]["MODELNAME"].chr(strlen($msg)).chr(0x00).$msg;
			if (SAMY_SendPacket($pkt,$ID, SAMSUNG_REMOTE_PORT, false) === false) return false;
			IPS_Sleep($time);
		}
		return true;
	} else {
		$msg = chr(0x00).chr(0x00).chr(0x00).chr(strlen(base64_encode($key))).chr(0x00).base64_encode($key);
		$pkt = $auth.chr(0x00).chr(strlen($samy[$ID]["MODELNAME"])).chr(0x00).$samy[$ID]["MODELNAME"].chr(strlen($msg)).chr(0x00).$msg;
		return SAMY_SendPacket($pkt,$ID, SAMSUNG_REMOTE_PORT, false);
	}
}
?>

Viel Erfolg,
Michael

Hi vielen Dank für das Bereitstellen deines tollen Scriptes !

Ich versuche gerade damit was hinzubekommen:

Aber ich bekomme zwar hin das eine Nachricht auf dem TV erscheint aber der Inhalt der Nachricht stimmt nicht :frowning:

Kannst du mir bitte ein paar Bespiele posten, wie ich eine Nachricht auf dem TV sende :slight_smile:

Was stimmt denn nicht ?
Ich habe gearde gesehen das ich in der Doku das Feld $Data[‚Subject‘] bei SAMSUNG_MESSAGE_SCHEDULE vergessen habe.
Und dass in der Doku der Prefix SAMY_ bei allen Funktionen fehlte… peinlich :o


require_once("Samsung.inc.php");
$Data['ID']=0;
$Data['FromNumber'] = '12345678';
$Data['FromName'] = 'Micha Mobil';
$Data['ToNumber'] = '87654321';
$Data['ToName'] = 'Küche';
if (SAMY_SendMessage(SAMSUNG_MESSAGE_CALL,$Data,SamyTV) === true)
{
    echo "Meldung erfolgreich abgesetzt.";
}else
{
    echo "Meldung konnte nicht abgesetzt werden!";
}

Wobei ich gerade, durch meine FritzBox, viel über SOAP und UPnP gelernt habe.
Ich werde das also noch mal erneuern. Besonders das abfragen von der Lautstärke nervt mich, das will ich noch auf Notify’s umbauen.

Michael

Danke dir ich bin schon weiter gekommen [emoji133][emoji133][emoji133] hast du es auch hinbekommen auf neueren TV so ca ab 2012-13 eine Nachricht auf dem TV zu schicken ?

Auf meinem 2009 Sams TV d Serie geht’s jetzt wunderbar aber auf dem 2012 TV will es nicht klappen [emoji22]

So was modernes habe ich nicht :wink:
Naja den BD-Player aber da habe ich noch nicht gesucht.
Michael

beim ausführen von:

<?
require_once("Samsung.inc.php");
$volume = SAMY_SendRemote("KEY_POWEROFF",0,SamyTV);
?>

passiert am TV nichts und ich erhalte folgende Meldung:

Warning: Semaphore ‚Samy‘ was not released!

eine Meldung verschicken funktioniert, gibt aber folgendes aus:

Meldung erfolgreich abgesetzt.Warning: Semaphore ‚Samy‘ was not released!

was mach ich da falsch?

Glaube eher das ich da etwas zu viel geändert habe, als ich meine Scripte für das Forum portiert habe.
Ich schaue mir das nachher mal in Ruhe an.
Michael

Ruhe und Zeit hatte ich zwar keine, aber Fehler beseitigt :smiley:

Zeile 288 ersetzen durch


		if (GetValueBoolean($samy[$ID]["PWR_VARID"]))
		{
			IPS_SemaphoreLeave("Samy");
			return true;
		}

Ist im ersten Post schon geändert.
Michael

Hi Nallchan,

ich überlege mir auch einen Samsung TV zu kaufen (H-Serie) - funktioniert denn Deine Lösung noch?

Ciao

Herbertf

Hi ich habe es auf neueren s tv nicht mehr hinbekommen

Gesendet von iPhone mit Tapatalk

Volume könnte noch gehen (da DLNA) Der PMR ist ab wohl seid der D-Serie oder ca 2011 nicht mehr verfügbar.
RC Kommandos gehen vielleicht noch, Die gehen sogar beim BD 7500 von 2013.
Michael

Bis dahin hat das noch gefunkt
Haben jetzt in 2016 einen zusätzlich gekauft da geht überhaupt nichts mehr.
Alles andere Ports etc.

Vermutlich funkt es über DLNA

Volume bestimmt, Aber der PMR (war auch ein Dienst auf dem TV welcher per UPnP funktioniert hat) wurde ersatzlos gestrichen.
Michael

Hat jemand eine Idee, wie man den momentanen Sender (Kanal) auslesen kann?