LG TV steuern/abfragen?

sollte eigentlich der Fall sein.

TV: 192.168.1.4
Syno Nas mit Docker 192.168.1.22

IPS Console auf: http://192.168.1.22:3777/console/

hat keiner ne Idee ?

Hallo zusammen,

ich wollte hier eine kleine Erweiterung teilen.
Ich hatte hier nichts gefunden und mich im Netz schlau gemacht.

Man kann sich PopUps auf dem Fernseher von selbst gesendeten Nachrichten schicken.

Im Script webos.ips.php diese Funktion hinzufügen:


function message($msg)
    {
		$command = '{"id":"message","type":"request","uri":"ssap://system.notifications/createToast","payload":{"message":"'.$msg.'"}}';
        $this->send_command($command);
    }

Der Aufruf erfolgt dann über:


include_once 'webos.ips.php';

$msg = "Das ist ein test";
$tv = new webOSTV("192.168.11.5",3000,"232dcd16a4479e647e236029479acf87");    // Change to the IP of your LG device                       // 
$tv->lg_handshake();
$tv->message($msg);

IMG_0287 (002).jpg
Sorry… Bekomme das Bild hier immer nur verkehrt rum eingefügt.

Grüße

Moin,

nicht gefunden ?
In LG TV steuern/abfragen ? ist das bereits umgesetzt, dafür braucht es keine neue Funktion :wink:

Aber trotzdem immer ein gutes Gefühl wenn so etwas eigenes dann auch funktioniert so wie es soll :loveips:

Hallo!

ich bin auch ganz neu hier habe schon vieles gelesen und bei mir funktioniert das ganz soweit wie eben das was vorhanden ist.
Aber ich finde nirgends eine Möglichkeit einen Kanal zu wechseln, bzw. schaffe ich es nicht eine php Funktion dafür zu schreiben…

hat jemand von euch schon weitere Funktionen hinzugefügt außer die drei ( function message, function power_off und function set_volume)?

das Problem ist im Endeffekt den „string“ für eine neue Funktion zusammen zu erstellen:
zb wie bei set volume

$command = "{\"id\":\"set_volume\",\"type\":\"request\",\"uri\":\"ssap://audio/setVolume\",\"payload\":{\"volume\":$vol}}";

für einen Kanal wechsel habe ich nun ein wenig gesucht leider stecke ich fest.
habe in dem forum:
https://knx-user-forum.de/forum/öffentlicher-bereich/gebäudetechnik-ohne-knx-eib/823383-ip-control-der-neuen-lg-webos-tv-s/page3

ein Projekt mit java gefunden:
Connect-SDK-Android-Core/WebOSTVService.java at master · ConnectSDK/Connect-SDK-Android-Core · GitHub

wenn man dort nach setChannel sucht finde ich diesen Code:


public void setChannelById(String channelId, ResponseListener<Object> listener) {
        String uri = "ssap://tv/openChannel";
        JSONObject payload = new JSONObject();

        try {
            payload.put("channelId", channelId);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        ServiceCommand<ResponseListener<Object>> request = new ServiceCommand<ResponseListener<Object>>(this, uri, payload, true, listener);
        request.send();
    }

in der sich schon mal die uri findet : „ssap://tv/openChannel“ dann das Object mit namen „channelId“.
so nun fehlt mir leider noch der rest um den String für den php code zusammen zu stellen.
was ist die ID ? und was ist der Type? wahrscheinlich „request“!?

ich würde dass nun so schreiben:

$command = "{\"id\":\"setchannel\",\"type\":\"request\",\"uri\":\"ssap://tv/openChannel",\"payload\":{\"channelId\":$channelId}}";

hat das jemand von euch schon geschafft?

Danke!

Hallo,
ich bekomme einfach keine Verbindung zum meinem LG UJ6309. Habe schon sämtliche Scripts ausprobiert, über QNAP NAS und Loxberry. Aber es kommt kein Pairingcode auf dem LG. Über iPhone kann ich steuern, da kommt auch eine Pairing-Abfrage. Wenn ich den Code nehme funktioniert es aber nicht. Bei Aufruf IP LG Port 3000 kommt „Hello World“.
Kann mir jemand helfen?
Gruß, Johny

Hallo,
Kann mir irgendjemand sagen, ob das bei den aktuellen Smart TV von LG (65UJ6309) überhaupt funktioniert?
Gruß, Johny

Hallo Luboo

Ja das klappt… oder was geht da bei dir nicht…?

Ich habe die Installation hinbekommen und brauche mal einen Lösungsansatz bzw einen Tipp wie ich die Sender aus dem Webfront heraus verwalte.

Ich brauche einen String mit dem Namen des Senders zB ZDF HD als Antwort, wenn ich auf einen Button klicke.

Auf Icon wollte ich verzichten, damit die Oberfläche des Webfront nicht zu groß wird, ich nutze vorwiegend ein Handy.
Irgendwie fehlt mir der Ansatz…
Gruß Helmut

Hallo Helmut, hast du schon eine Lösung? Ich stehe vor einem ähnlichen Problem und dachte ich kann die Sendernamen von der TV-Liste in ein Variablenprofil schreiben und dann per Slider oder so die Sender anwählen. Das geht aber nicht, da eine Variable nur 128 Zuweisung ermöglicht und ich über 512 Sender habe. So muss ich das händisch auf das wichtigste beschränken. Sonst könnte man bei der Aktualisierung der Sender am TV die Listen automatisch generieren!

Gruß Tommy

:wink:
nee, leider habe ich nichts was ich zeigen könnte. Ich wollte eigentlich nichts mit Ikon machen, aber ich sehe auch keinen anderen Horizont.
Nur die gängigsten Programme mochte ich in der Webfront haben,
Gruß Helmut

Ich habe jetzt eine Lösung:
ich habe eine Integervariable erstellt, der ein selbst erstelltes Variablenprofil erstellt, bei jedem Wert den Text des Sendernamens eingeschrieben.
Der muß aber genau dem Text aus dem Namen, der in „print_r($channels);“ auftaucht, entsprechen.

Der Intergervariablen ein Aktionscript zugewiesen, das ruft ein Script auf, deren Funktion es iM ist das Gerät auf den Sender zu schalten.

Damit habe ich nun nicht gerade alle fast 1000 Sendernamen erstellt, aber da Integer grösser als die angesprochenen 512 Werte annehmen könnte sollte eine große Senderanzahl möglich sein.

Bitte entschuldigt mein zusammenkopiertes Script, aber es läuft.
Aktionscript:

<?

SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

IPS_RunScript(40575 /*[Fernseher\Kanal Steuern]*/);

?>

LG Script:

<?
session_start();
$tv = new SmartTV('192.168.x.xyz'); // new SmartTV('192.168.2.103', 8080)
if (!isset($_SESSION['SESSION_ID'])) {

	$tv->setPairingKey(xxxxxxx); // 

	try {
		$_SESSION['SESSION_ID'] = $tv->authenticate();
	} catch (Exception $e) {
		die('Authentication failed, I am sorry.');
	}
} else {
	$tv->setSession($_SESSION['SESSION_ID']);
}
	
if (isset($_GET['cmd'])) {
	switch($_GET['cmd']) {
		case 'screen':
			header('Content-Type: image/jpeg');
			exit ($tv->queryData(TV_INFO_SCREEN));
			break;
			
		case 'changeChannel':
			if (!isset($_GET['value'])) {
				exit;
			}
			$channelName = strtolower($_GET['value']);
			foreach ($_SESSION['CHANNEL_LIST'] as $channel) {
				if (strtolower($channel['chname']) == $channelName) {
					$tv->processCommand(TV_CMD_CHANGE_CHANNEL, $channel);
					break;
				}
			}
			break;
			
		case 'info':
			$currentChannel = $tv->queryData(TV_INFO_CURRENT_CHANNEL);
			$text = 'You\'re watching <b>'.$currentChannel->progName.'</b> on <b>'.$currentChannel->chname.'</b>';
			
			if (!isset($_SESSION['CURRENT_CHANNEL']) || strtolower($currentChannel->chname) != strtolower($_SESSION['CURRENT_CHANNEL'])) {
				$text .= '___---___Change channel: <select id="programList">';
				if (!isset($_SESSION['CHANNEL_LIST'])) {
					$_SESSION['CHANNEL_LIST'] = array();
					foreach ($tv->queryData(TV_INFO_CHANNEL_LIST) as $channel) {
						$_SESSION['CHANNEL_LIST'][] = (array)$channel;
					}
				}
				foreach ($_SESSION['CHANNEL_LIST'] as $channel) {
					$text .= '<option value="'.$channel['chname'].'" '.(strtolower($channel['chname']) == strtolower($currentChannel->chname) ? 'selected' : '').'>'.$channel['chname'].'</option>';
				}
				$text .= '</select>';
				$_SESSION['CURRENT_CHANNEL'] = (string)$currentChannel->chname;
			}
			exit ($text);
			break;
			
		case 'keyPress':
			if (!isset($_GET['value'])) {
				exit;
			}
			$codes = array(
				'up' => TV_CMD_UP,
				'down' => TV_CMD_DOWN,
				'left' => TV_CMD_LEFT,
				'right' => TV_CMD_RIGHT,
				'enter' => TV_CMD_OK,
				'esc' => TV_CMD_EXIT,
				'backspace' => TV_CMD_BACK,
				'h' => TV_CMD_HOME_MENU
			);
			$tv->processCommand($codes[$_GET['value']]);
			break;
	}
	exit;
} else {
	unset ($_SESSION['CURRENT_CHANNEL']);
}






if (!extension_loaded('curl')) {
	die ('You have to install/enable curl in order to use this application.');
}

/**
 * Some constants
**/
define ('TV_CMD_POWER', 1);
define ('TV_CMD_NUMBER_0', 2);
define ('TV_CMD_NUMBER_1', 3);
define ('TV_CMD_NUMBER_2', 4);
define ('TV_CMD_NUMBER_3', 5);
define ('TV_CMD_NUMBER_4', 6);
define ('TV_CMD_NUMBER_5', 7);
define ('TV_CMD_NUMBER_6', 8);
define ('TV_CMD_NUMBER_7', 9);
define ('TV_CMD_NUMBER_8', 10);
define ('TV_CMD_NUMBER_9', 11);
define ('TV_CMD_UP', 12);
define ('TV_CMD_DOWN', 13);
define ('TV_CMD_LEFT', 14);
define ('TV_CMD_RIGHT', 15);
define ('TV_CMD_OK', 20);
define ('TV_CMD_HOME_MENU', 21);
define ('TV_CMD_BACK', 23);
define ('TV_CMD_VOLUME_UP', 24);
define ('TV_CMD_VOLUME_DOWN', 25);
define ('TV_CMD_MUTE_TOGGLE', 26);
define ('TV_CMD_CHANNEL_UP', 27);
define ('TV_CMD_CHANNEL_DOWN', 28);
define ('TV_CMD_BLUE', 29);
define ('TV_CMD_GREEN', 30);
define ('TV_CMD_RED', 31);
define ('TV_CMD_YELLOW', 32);
define ('TV_CMD_PLAY', 33);
define ('TV_CMD_PAUSE', 34);
define ('TV_CMD_STOP', 35);
define ('TV_CMD_FAST_FORWARD', 36);
define ('TV_CMD_REWIND', 37);
define ('TV_CMD_SKIP_FORWARD', 38);
define ('TV_CMD_SKIP_BACKWARD', 39);
define ('TV_CMD_RECORD', 40);
define ('TV_CMD_RECORDING_LIST', 41);
define ('TV_CMD_REPEAT', 42);
define ('TV_CMD_LIVE_TV', 43);
define ('TV_CMD_EPG', 44);
define ('TV_CMD_PROGRAM_INFORMATION', 45);
define ('TV_CMD_ASPECT_RATIO', 46);
define ('TV_CMD_EXTERNAL_INPUT', 47);
define ('TV_CMD_PIP_SECONDARY_VIDEO', 48);
define ('TV_CMD_SHOW_SUBTITLE', 49);
define ('TV_CMD_PROGRAM_LIST', 50);
define ('TV_CMD_TELE_TEXT', 51);
define ('TV_CMD_MARK', 52);
define ('TV_CMD_3D_VIDEO', 400);
define ('TV_CMD_3D_LR', 401);
define ('TV_CMD_DASH', 402);
define ('TV_CMD_PREVIOUS_CHANNEL', 403);
define ('TV_CMD_FAVORITE_CHANNEL', 404);
define ('TV_CMD_QUICK_MENU', 405);
define ('TV_CMD_TEXT_OPTION', 406);
define ('TV_CMD_AUDIO_DESCRIPTION', 407);
define ('TV_CMD_ENERGY_SAVING', 409);
define ('TV_CMD_AV_MODE', 410);
define ('TV_CMD_SIMPLINK', 411);
define ('TV_CMD_EXIT', 412);
define ('TV_CMD_RESERVATION_PROGRAM_LIST', 413);
define ('TV_CMD_PIP_CHANNEL_UP', 414);
define ('TV_CMD_PIP_CHANNEL_DOWN', 415);
define ('TV_CMD_SWITCH_VIDEO', 416);
define ('TV_CMD_APPS', 417);
define ('TV_CMD_MOUSE_MOVE', 'HandleTouchMove');
define ('TV_CMD_MOUSE_CLICK', 'HandleTouchClick');
define ('TV_CMD_TOUCH_WHEEL', 'HandleTouchWheel');
define ('TV_CMD_CHANGE_CHANNEL', 'HandleChannelChange');
define ('TV_CMD_SCROLL_UP', 'up');
define ('TV_CMD_SCROLL_DOWN', 'down');
define ('TV_INFO_CURRENT_CHANNEL', 'cur_channel');
define ('TV_INFO_CHANNEL_LIST', 'channel_list');
define ('TV_INFO_CONTEXT_UI', 'context_ui');
define ('TV_INFO_VOLUME', 'volume_info');
define ('TV_INFO_SCREEN', 'screen_image');
define ('TV_INFO_3D', 'is_3d');
define ('TV_LAUNCH_APP', 'AppExecute');




class SmartTV 
{
	public function __construct($ipAddress, $port = 8080) {
		$this->connectionDetails = array($ipAddress, $port);
	}
	
	public function setPairingKey($pk) {
		$this->pairingKey = $pk;
	}
	
	public function displayPairingKey() {
		$this->sendXMLRequest('/roap/api/auth', self::encodeData(
			array('type' => 'AuthKeyReq'), 'auth'
		));
	}
	
	public function setSession($sess) {
		$this->session = $sess;
	}
	
	public function authenticate() {
		if ($this->pairingKey === null) {
			throw new Exception('No pairing key given.');
		}
		return ($this->session = $this->sendXMLRequest('/roap/api/auth', self::encodeData(
			array(
				'type' => 'AuthReq',
				'value' => $this->pairingKey
			),
			'auth'
		))['session']);
	}

	public function processCommand($commandName, $parameters = []) {
		if ($this->session === null) {
			throw new Exception('No session id given.');
		}
		if (is_numeric($commandName) && count($parameters) < 1) {
			$parameters['value'] = $commandName;
			$commandName = 'HandleKeyInput';
		}
		if (is_string($parameters) || is_numeric($parameters)) {
			$parameters = array('value' => $parameters);
		} elseif (is_object($parameters)) {
			$parameters = (array)$parameters;
		}
		$parameters['name'] = $commandName;
		return ($this->sendXMLRequest('/roap/api/command', 
			self::encodeData($parameters, 'command')
		));
	}
	
	public function queryData($targetId) {
		if ($this->session === null) {
			throw new Exception('No session id given.');
		}
		$var = $this->sendXMLRequest('/roap/api/data?target='.$targetId);
		return isset($var['data']) ? $var['data'] : $var;
	}
	
	private function sendXMLRequest($actionFile, $data = '') {
		curl_setopt(($ch = curl_init()), CURLOPT_URL, $this->connectionDetails[0] . ':' . $this->connectionDetails[1] . $actionFile);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
			'Content-Type: application/atom+xml',
			'Connection: Keep-Alive'
		));
		if (strlen($data) > 0) {
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		}
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		$envar   = curl_exec($ch);
		$execute = (array)@simplexml_load_string($envar);
		if (isset($execute['ROAPError']) && $execute['ROAPError'] != '200') {
			throw new Exception('Error (' . $execute['ROAPError'] . '): ' . $execute['ROAPErrorDetail']);
		}
		return count($execute) < 2 ? $envar : $execute;
	}
	
	private static function encodeData($data, $actionType, $xml=null) {
		if ($xml == null) {
			$xml = simplexml_load_string("<!--?xml version=\"1.0\" encoding=\"utf-8\"?--><".$actionType." />");
		}
		foreach($data as $key => $value) {
			if (is_array($value))  {
				$node = $xml->addChild($key);
				self::encodeData($value, $actionType, $node);
			} else  {
				$xml->addChild($key, htmlentities($value));
			}
		}
		return $xml->asXML();
	}
	
	private $connectionDetails;
	private $pairingKey;
	private $session;
}

/**
 * Change channel (Channel VIVA)
**/

// Get channel list
$channels = $tv->queryData(TV_INFO_CHANNEL_LIST);
//print_r($channels);
 
// Channel name
$channelName = strval(GetValueFormatted(50879 /*[Fernseher\Fernsehen]*/));

//echo strval($channelName);
// Search for channel $channelName
foreach ($channels as $channel) {
	if (($channel->chname) == strval($channelName)) {
		// Change channel
        //('TV_CMD_POWER', 1);
        //$tv->processCommand(TV_CMD_CHANNEL_UP);	
			
		$tv->processCommand(TV_CMD_CHANGE_CHANNEL, $channel);
		echo $channel;
		break;
	}
}
?>

So sieht es dann im Profil und Webfront aus.
Gruß Helmut

Webfront.jpg

Hallo,
hat jemand eine Idee wie ich Amazone Prime und Netflix in IPS (auf einem LG 2019) einbinden könnte?
Danke und lg

Hallo Helmut,

das hatte ich schon so ähnlich auf dem Schirm. Ich wollte die Senderliste automatisch in ein Variablenprofil schreiben, was aber daran scheitert das man nur 128 Assoziationen speichern kann!!
Oder mache ich was falsch?

Schade, dann muß man die Liste händisch auf die wichtigsten Sender beschränken.

Gruß Tommy

Naja ok, wenn denn das so ist, und Du mehr als diese Anzahl möchtest, dann ist mein Vorschlag: mach 'ne 2. Integer auf, mit einer 2. Assoziation und ordne die Einträge nach zB. Deutschsprachlich Private oä

Mit ICON’s sieht es zwar optisch schöner aus, aber braucht aber viel Platz.
Gruß Helmut

Hi, muss man alle function() im webos.inc.php so ändern?

Abend! Hol das jetzt nochmal hoch :slight_smile:

Bei mir funktioniert dank Euch das Einschalten, Ausschalten, VolumeUP und Down! Danke.

Da ich keine „normalen“ Sender besitze, sondern nur über Prime oder Netflix gucke, habe ich da mal eine Frage an die Experten:

Wie könnte ich das einbinden und steuern? Also z.b. Button für Netflix und der LG schaltet auf Netflix um. Und dann irgendwie mit Cursortasten navigieren, damit man diese dämliche LG Fernbedienung endlich verschrotten kann…

Danke und lg
Christian

Bei dem Problem mit dem Netflix kann ich Dir nicht helfen, würde aber auch vermuten das es mit dem „Cursertasten Navigieren“ klappen sollte.
Was mich mehr interessiert ist, wie Du es geschafft hast den LG anzuschalten, denn soweit ich weiß unterstützt die API das nicht!?

Gruß
Jens

Einschalten mit WOL :wink:

-Chris-

Exakt und ausschalten mit: TurnOff() - Punkt 3. von dalef!

Danke an Alle!

Frage: Welche Befehle gibt es noch außer Ein/Aus/VolumeUP und VolumeDOWN ?

lg