+ Antworten
Seite 1 von 10 1 2 3 ... LetzteLetzte
Ergebnis 1 bis 10 von 95
  1. #1
    Registriert seit
    Dec 2007
    Ort
    Nienburg (Weser)
    Beiträge
    1,335

    Standard LG TV steuern/abfragen ?

    Nabend

    Nachdem wir uns ein verfrühtes Weihnachtsgeschenk gemacht haben, bin ich auf der Suche nach Möglichkeiten einen aktuellen LG TV zu steuern und/oder die Daten abzufragen.
    Hat da jemand schon etwas fertiges laufen bzw. gibt es da ne Möglichkeit den Status abzufragen? Power/Kanal/Input/Lautstärke/Firmware usw. ?


    Gruß
    Jens
    _________
    IPS Unlimited unter WHS2011 auf HP N40L
    Wago 750 System, Homematic, 1-Wire,
    Squeezebox, Fritzbox, Dreambox, Instar Cams

  2. #2
    Registriert seit
    Dec 2007
    Ort
    Nienburg (Weser)
    Beiträge
    1,335

    85 Klicks, aber keiner scheint etwas mitzuteilen zu haben ... schade.


    Hier gibt es Infos zu dem Protokoll, aber ich werde leider nicht schlau daraus:
    Help - LG Smart TV Document

    Hier gibt es eine Java Lösung für den Raspi
    http://book2s.com/java/src/package/c...tvservice.html

    weitere Infos/Commandos
    lgtv2

    FHEM Lösung
    FHEM Referenz



    Hier habe ich dann noch eine PHP Class gefunden:
    PHP-Code:
    <?php

    class webOSTV
    {
        private 
    $host$port$ws_key$path$lg_key$sock$connected=false$handshaked=false;

        function 
    webOSTV($host$port=3000$lgKey="NOKEY"$path="/")
        {
            
    $this->host $host;
            
    $this->port $port;
            
    $this->lg_key $lgKey;
            
    $this->path $path;
            
    $this->ws_key $key base64_encode(generateRandomString(16falsetrue));
            if (
    $this->lg_key=="NOKEY") unset($this->lg_key);    
        }
            
        function 
    connect()
        {
            
    $ws_handshake_cmd "GET " $this->path " HTTP/1.1\r\n";
            
    $ws_handshake_cmd.= "Upgrade: websocket\r\n";
            
    $ws_handshake_cmd.= "Connection: Upgrade\r\n";
            
    $ws_handshake_cmd.= "Sec-WebSocket-Version: 13\r\n";            
            
    $ws_handshake_cmd.= "Sec-WebSocket-Key: " $this->ws_key "\r\n";
            
    $ws_handshake_cmd.= "Host: ".$this->host.":".$this->port."\r\n\r\n";
            
    $this->sock fsockopen($this->host$this->port$errno$errstr2);
            
    socket_set_timeout($this->sock010000);
            echo     
    "Sending WS handshake\n$ws_handshake_cmd\n";
            
    $response $this->send($ws_handshake_cmd);
            if (
    $response)
            {
                echo 
    "WS Handshake Response:\n$response\n";
            } else 
                echo 
    "ERROR during WS handshake!\n";
            
    preg_match('#Sec-WebSocket-Accept:\s(.*)$#mU'$response$matches);
            if (
    $matches) {
                
    $keyAccept trim($matches[1]);
                
    $expectedResonse base64_encode(pack('H*'sha1($this->ws_key '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
                
    $this->connected = ($keyAccept === $expectedResonse) ? true false;
            } else 
    $this->connected=false;
            if (
    $this->connected) echo "Sucessfull WS connection to $this->host:$this->port\n\n";
            return 
    $this->connected;  
        }
        
        function 
    lg_handshake()
        {
            if (!
    $this->connected$this->connect();
            if (
    $this->connected)
            {
                
    $handshake =    "{\"type\":\"register\",\"id\":\"register_0\",\"payload\":{\"forcePairing\":false,\"pairingType\":\"PROMPT\",\"client-key\":\"HANDSHAKEKEYGOESHERE\",\"manifest\":{\"manifestVersion\":1,\"appVersion\":\"1.1\",\"signed\":{\"created\":\"20140509\",\"appId\":\"com.lge.test\",\"vendorId\":\"com.lge\",\"localizedAppNames\":{\"\":\"LG Remote App\",\"ko-KR\":\"리모컨 ì•±\",\"zxx-XX\":\"ЛГ Rэмotэ AПП\"},\"localizedVendorNames\":{\"\":\"LG Electronics\"},\"permissions\":[\"TEST_SECURE\",\"CONTROL_INPUT_TEXT\",\"CONTROL_MOUSE_AND_KEYBOARD\",\"READ_INSTALLED_APPS\",\"READ_LGE_SDX\",\"READ_NOTIFICATIONS\",\"SEARCH\",\"WRITE_SETTINGS\",\"WRITE_NOTIFICATION_ALERT\",\"CONTROL_POWER\",\"READ_CURRENT_CHANNEL\",\"READ_RUNNING_APPS\",\"READ_UPDATE_INFO\",\"UPDATE_FROM_REMOTE_APP\",\"READ_LGE_TV_INPUT_EVENTS\",\"READ_TV_CURRENT_TIME\"],\"serial\":\"2f930e2d2cfe083771f68e4fe7bb07\"},\"permissions\":[\"LAUNCH\",\"LAUNCH_WEBAPP\",\"APP_TO_APP\",\"CLOSE\",\"TEST_OPEN\",\"TEST_PROTECTED\",\"CONTROL_AUDIO\",\"CONTROL_DISPLAY\",\"CONTROL_INPUT_JOYSTICK\",\"CONTROL_INPUT_MEDIA_RECORDING\",\"CONTROL_INPUT_MEDIA_PLAYBACK\",\"CONTROL_INPUT_TV\",\"CONTROL_POWER\",\"READ_APP_STATUS\",\"READ_CURRENT_CHANNEL\",\"READ_INPUT_DEVICE_LIST\",\"READ_NETWORK_STATE\",\"READ_RUNNING_APPS\",\"READ_TV_CHANNEL_LIST\",\"WRITE_NOTIFICATION_TOAST\",\"READ_POWER_STATE\",\"READ_COUNTRY_INFO\"],\"signatures\":[{\"signatureVersion\":1,\"signature\":\"eyJhbGdvcml0aG0iOiJSU0EtU0hBMjU2Iiwia2V5SWQiOiJ0ZXN0LXNpZ25pbmctY2VydCIsInNpZ25hdHVyZVZlcnNpb24iOjF9.hrVRgjCwXVvE2OOSpDZ58hR+59aFNwYDyjQgKk3auukd7pcegmE2CzPCa0bJ0ZsRAcKkCTJrWo5iDzNhMBWRyaMOv5zWSrthlf7G128qvIlpMT0YNY+n/FaOHE73uLrS/g7swl3/qH/BGFG2Hu4RlL48eb3lLKqTt2xKHdCs6Cd4RMfJPYnzgvI4BNrFUKsjkcu+WD4OO2A27Pq1n50cMchmcaXadJhGrOqH5YmHdOCj5NSHzJYrsW0HPlpuAx/ECMeIZYDh6RMqaFM2DXzdKX9NmmyqzJ3o/0lkk/N97gfVRLW5hA29yeAwaCViZNCP8iC9aO0q9fQojoa7NQnAtw==\"}]}}}";
                if (isset(
    $this->lg_key)) 
                    
    $handshake str_replace('HANDSHAKEKEYGOESHERE',$this->lg_key,$handshake);
                else  
    $handshake =    "{\"type\":\"register\",\"id\":\"register_0\",\"payload\":{\"forcePairing\":false,\"pairingType\":\"PROMPT\",\"manifest\":{\"manifestVersion\":1,\"appVersion\":\"1.1\",\"signed\":{\"created\":\"20140509\",\"appId\":\"com.lge.test\",\"vendorId\":\"com.lge\",\"localizedAppNames\":{\"\":\"LG Remote App\",\"ko-KR\":\"리모컨 ì•±\",\"zxx-XX\":\"ЛГ Rэмotэ AПП\"},\"localizedVendorNames\":{\"\":\"LG Electronics\"},\"permissions\":[\"TEST_SECURE\",\"CONTROL_INPUT_TEXT\",\"CONTROL_MOUSE_AND_KEYBOARD\",\"READ_INSTALLED_APPS\",\"READ_LGE_SDX\",\"READ_NOTIFICATIONS\",\"SEARCH\",\"WRITE_SETTINGS\",\"WRITE_NOTIFICATION_ALERT\",\"CONTROL_POWER\",\"READ_CURRENT_CHANNEL\",\"READ_RUNNING_APPS\",\"READ_UPDATE_INFO\",\"UPDATE_FROM_REMOTE_APP\",\"READ_LGE_TV_INPUT_EVENTS\",\"READ_TV_CURRENT_TIME\"],\"serial\":\"2f930e2d2cfe083771f68e4fe7bb07\"},\"permissions\":[\"LAUNCH\",\"LAUNCH_WEBAPP\",\"APP_TO_APP\",\"CLOSE\",\"TEST_OPEN\",\"TEST_PROTECTED\",\"CONTROL_AUDIO\",\"CONTROL_DISPLAY\",\"CONTROL_INPUT_JOYSTICK\",\"CONTROL_INPUT_MEDIA_RECORDING\",\"CONTROL_INPUT_MEDIA_PLAYBACK\",\"CONTROL_INPUT_TV\",\"CONTROL_POWER\",\"READ_APP_STATUS\",\"READ_CURRENT_CHANNEL\",\"READ_INPUT_DEVICE_LIST\",\"READ_NETWORK_STATE\",\"READ_RUNNING_APPS\",\"READ_TV_CHANNEL_LIST\",\"WRITE_NOTIFICATION_TOAST\",\"READ_POWER_STATE\",\"READ_COUNTRY_INFO\"],\"signatures\":[{\"signatureVersion\":1,\"signature\":\"eyJhbGdvcml0aG0iOiJSU0EtU0hBMjU2Iiwia2V5SWQiOiJ0ZXN0LXNpZ25pbmctY2VydCIsInNpZ25hdHVyZVZlcnNpb24iOjF9.hrVRgjCwXVvE2OOSpDZ58hR+59aFNwYDyjQgKk3auukd7pcegmE2CzPCa0bJ0ZsRAcKkCTJrWo5iDzNhMBWRyaMOv5zWSrthlf7G128qvIlpMT0YNY+n/FaOHE73uLrS/g7swl3/qH/BGFG2Hu4RlL48eb3lLKqTt2xKHdCs6Cd4RMfJPYnzgvI4BNrFUKsjkcu+WD4OO2A27Pq1n50cMchmcaXadJhGrOqH5YmHdOCj5NSHzJYrsW0HPlpuAx/ECMeIZYDh6RMqaFM2DXzdKX9NmmyqzJ3o/0lkk/N97gfVRLW5hA29yeAwaCViZNCP8iC9aO0q9fQojoa7NQnAtw==\"}]}}}";
                echo 
    "Sending LG handshake\n$handshake\n";
                
    $response $this->send(hybi10Encode($handshake));
                if (
    $response)
                {
                    echo 
    "\nLG Handshake Response\n".json_string($response)."\n";
                    
    $result json_array($response);
                    if (
    $result && array_key_exists('id',$result) &&  $result['id']=='result_0' && array_key_exists('client-key',$result['payload']))
                    {
                        
    // LG client-key received: COMPARE!!!
                        
    if ($this->lg_key == $result['payload']['client-key'])
                            echo 
    "LG Client-Key successfully approved\n"
                    } else if (
    $result && array_key_exists('id',$result) &&  $result['id']=='register_0' && array_key_exists('pairingType',$result['payload']) && array_key_exists('returnValue',$result['payload']))
                    {    
    // LG TV is prompting for access rights
                        
    if ($result['payload']['pairingType'] == "PROMPT" && $result['payload']['returnValue'] == "true"
                        {
                            
    $starttime microtime(1);
                            
    $lg_key_received false;
                            
    $error_received false;
                            do {
                                
    $response = @fread($this->sock8192);
                                
    $result json_array($response);
                                if (
    $result && array_key_exists('id',$result) &&  $result['id']=='register_0' && is_array($result['payload']) && array_key_exists('client-key',$result['payload']))
                                {
                                    
    $lg_key_received true;
                                    
    $this->lg_key $result['payload']['client-key'];
                                    echo 
    "LG Client-Key successfully received: $this->lg_key\n"
                                } else if (
    $result && array_key_exists('id',$result) &&  $result['id']=='register_0' && array_key_exists('error',$result))
                                {
                                    
    $error_received true;
                                    echo 
    "ERROR: ".$result['error']."\n";
                                }
                                
    usleep(200000);
                                
    $time microtime(1);
                            } while (
    $time-$starttime<60 && !$lg_key_received && !$error_received);
                        }
                    }
                } else echo 
    "ERROR during LG handshake:\n";
            } else return 
    FALSE
        }

        function 
    disconnect()
        { 
            
    $this->connected=false;
            @
    fclose($this->sock);
            echo 
    "Connection closed to $this->host\n";
        }

        function 
    send($msg)
        {
            @
    fwrite($this->sock$msg);
            
    usleep(250000);
            
    $response = @fread($this->sock8192);
            return 
    $response;
        }
        
        function 
    send_command($cmd)
        {
            if (!
    $this->connected$this->connect();
            if (
    $this->connected)
            {
                echo 
    "Sending command      : $cmd\n";
                
    $response $this->send(hybi10Encode($cmd));
                if (
    $response)
                    echo 
    "Command response     : ".json_string($response)."\n";
                else 
                    echo 
    "Error sending command: $cmd\n";
                return 
    $response;            
            } 
        }
        
        function 
    message($msg)
        {
            
    $command "{\"id\":\"message\",\"type\":\"request\",\"uri\":\"ssap://system.notifications/createToast\",\"payload\":{\"message\": \"$msg\"}}";
            
    $this->send_command($command);
        }
        
        function 
    power_off()
        {
            
    $command "{\"id\":\"power_off\",\"type\":\"request\",\"uri\":\"ssap://system/turnOff\"}";
            
    $this->send_command($command);
        }

        function 
    set_volume($vol)
        {
            
    $command "{\"id\":\"set_volume\",\"type\":\"request\",\"uri\":\"ssap://audio/setVolume\",\"payload\":{\"volume\":$vol}}";
            
    $this->send_command($command);
        }
    }    
            
    function 
    hybi10Encode($payload$type 'text'$masked true) {
            
    $frameHead = array();
            
    $frame '';
            
    $payloadLength strlen($payload);

            switch (
    $type) {
                case 
    'text':
                    
    // first byte indicates FIN, Text-Frame (10000001):
                    
    $frameHead[0] = 129;
                    break;

                case 
    'close':
                    
    // first byte indicates FIN, Close Frame(10001000):
                    
    $frameHead[0] = 136;
                    break;

                case 
    'ping':
                    
    // first byte indicates FIN, Ping frame (10001001):
                    
    $frameHead[0] = 137;
                    break;

                case 
    'pong':
                    
    // first byte indicates FIN, Pong frame (10001010):
                    
    $frameHead[0] = 138;
                    break;
            }

            
    // set mask and payload length (using 1, 3 or 9 bytes)
            
    if ($payloadLength 65535) {
                
    $payloadLengthBin str_split(sprintf('%064b'$payloadLength), 8);
                
    $frameHead[1] = ($masked === true) ? 255 127;
                for (
    $i 0$i 8$i++) {
                    
    $frameHead[$i 2] = bindec($payloadLengthBin[$i]);
                }

                
    // most significant bit MUST be 0 (close connection if frame too big)
                
    if ($frameHead[2] > 127) {
                    
    $this->close(1004);
                    return 
    false;
                }
            } elseif (
    $payloadLength 125) {
                
    $payloadLengthBin str_split(sprintf('%016b'$payloadLength), 8);
                
    $frameHead[1] = ($masked === true) ? 254 126;
                
    $frameHead[2] = bindec($payloadLengthBin[0]);
                
    $frameHead[3] = bindec($payloadLengthBin[1]);
            } else {
                
    $frameHead[1] = ($masked === true) ? $payloadLength 128 $payloadLength;
            }

            
    // convert frame-head to string:
            
    foreach (array_keys($frameHead) as $i) {
                
    $frameHead[$i] = chr($frameHead[$i]);
            }

            if (
    $masked === true) {
                
    // generate a random mask:
                
    $mask = array();
                for (
    $i 0$i 4$i++) {
                    
    $mask[$i] = chr(rand(0255));
                }

                
    $frameHead array_merge($frameHead$mask);
            }
            
    $frame implode(''$frameHead);
            
    // append payload to frame:
            
    for ($i 0$i $payloadLength$i++) {
                
    $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i 4] : $payload[$i];
            }

            return 
    $frame;
        }

        function 
    generateRandomString($length 10$addSpaces true$addNumbers true)
        {  
            
    $characters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}';
            
    $useChars = array();
            
    // select some random chars:    
            
    for($i 0$i $length$i++)
            {
                
    $useChars[] = $characters[mt_rand(0strlen($characters)-1)];
            }
            
    // add spaces and numbers:
            
    if($addSpaces === true)
            {
                
    array_push($useChars' '' '' '' '' '' ');
            }
            if(
    $addNumbers === true)
            {
                
    array_push($useCharsrand(0,9), rand(0,9), rand(0,9));
            }
            
    shuffle($useChars);
            
    $randomString trim(implode(''$useChars));
            
    $randomString substr($randomString0$length);
            return 
    $randomString;
        }

        function 
    json_array($str)
        {
            
    $result json_decode(json_string($str),true);
            return 
    $result;
        }
        
        function 
    json_string($str)
        {
            
    $from strpos($str,"{");
            
    $to strripos($str,"}");
            
    $len $to-$from+1;
            
    $result substr($str,$from,$len);
            return 
    $result;
        }
        
    ?>
    und hier das passende Script dafür:

    PHP-Code:
    <?php

    include_once 'webos.inc.php';
    $tv = new webOSTV("192.168.0.200"); // Note the Client Key and put it into next line 
    //$tv = new webOSTV("192.168.0.200",3000,"3a91c2ac6c052461bb313724c31b8f37");    // Change to the IP of your LG device
    $tv->connect();                        // 
    $tv->lg_handshake();
    $tv->message("YEAH, it works!!!");
    sleep (5);
    $tv->set_volume(100); 
    sleep(10);
    $tv->disconnect();

    ?>
    Damit kann man zumindest schon mal die Lautstärke setzen, den Fernseher ausschalten und auch Textnachrichten senden, aber mehr ist damit leider nicht umgesetzt. Evtl. kann das ja jemand erweitern der mehr Plan davon hat als ich und Dinge verfügbar machen wie Powerstatus (on/off) , Einschalten (geht scheinbar nicht ?), Welcher Eingang ist akiv usw.


    Gruß
    Jens
    Geändert von Tetrapack (12.12.16 um 14:24 Uhr)
    _________
    IPS Unlimited unter WHS2011 auf HP N40L
    Wago 750 System, Homematic, 1-Wire,
    Squeezebox, Fritzbox, Dreambox, Instar Cams

  3. #3
    Registriert seit
    Aug 2012
    Beiträge
    113

    Hi,

    ich hab einen etwas älteren LG smart TV.
    Bisher hab ich keinen Sinn gesehen, diesen per IPS zu steuern, jetzt mit Echo Dot wird es jedoch mmn. interessant.
    Werde morgen mal etwas "basteln" gibt ja eine LG smart TV app, vielleicht bekomme ich was hin.

    edit: habe hier was gefunden. https://github.com/SteveWinfield/PHP-LG-SmartTV

    Gruß Christoph
    Geändert von raypancel (27.12.16 um 02:33 Uhr)

  4. #4
    Registriert seit
    May 2005
    Beiträge
    255

    hallo,
    wenn Du da etwas hinbekommst bin ich sehr interressiert. Ich habe so einen Fernseher, mir fehlt nur das Programmierwissen, um selbst etwas zu stricken.
    Gruß
    Jürgen

  5. #5
    Registriert seit
    Dec 2007
    Ort
    Nienburg (Weser)
    Beiträge
    1,335

    Wie bereits geschrieben funktioniert das Script aus meinem Beitrag und wenn ich mir die Lösung von SteveWinfield ansehe, dann ist das auch nix großartig anderes

    Scheinbar wird einschalten bzw. die Abfrage vom Powerstatus nicht unterstützt.


    Gruß
    Jens
    _________
    IPS Unlimited unter WHS2011 auf HP N40L
    Wago 750 System, Homematic, 1-Wire,
    Squeezebox, Fritzbox, Dreambox, Instar Cams

  6. #6
    Registriert seit
    Aug 2012
    Beiträge
    113

    Ja, einschalten funktioniert leider nicht.
    Ausschalten, umschalten, lautstärke, mute, und alle weiteren Knöpfe der Fernbedienung funktionieren. Habe ich vorhin getestet...

  7. #7
    Registriert seit
    Aug 2012
    Beiträge
    113

    Hi, habe mal etwas geschrieben, funktioniert auch soweit aber habe selbst nicht die großen PHP Kenntnisse.
    Daher bitte über die Strukturen etc. hinwegsehen

    Im LG_Command Skript die IP des TV eintragen. TV einschalten und das Skript einmal ausführen.
    Am TV wird der Pairing Key angezeigt, dieser muss dann im Skript eingetragen werden.
    Zudem werden Variablen mit Profilen und Ereignisse erstellt.

    Gruß Christoph

    Skript SmartTV.PHP
    PHP-Code:
    <?php
    /**
     * ----------------------------------------
     * @title PHP-LG-SmartTV
     * @desc LG SmartTV API
     * @author Steve Winfield
     * @copyright 2014 $AUTHOR$
     * @license see /LICENCE
     * ----------------------------------------
     * https://github.com/SteveWinfield/PHP-LG-SmartTV
    **/
    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($chCURLOPT_HTTPHEADER, array(
                
    'Content-Type: application/atom+xml',
                
    'Connection: Keep-Alive'
            
    ));
            if (
    strlen($data) > 0) {
                
    curl_setopt($chCURLOPT_POST1);
                
    curl_setopt($chCURLOPT_POSTFIELDS$data);
            }
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
    $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) < $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($keyhtmlentities($value));
                }
            }
            return 
    $xml->asXML();
        }
        

        private 
    $connectionDetails;
        private 
    $pairingKey;
        private 
    $session;
    }

    ?>
    Skript LG_command:
    PHP-Code:
    <?
    /**
     * ----------------------------------------
     * Example - PHP LG SmartTV API
     * ----------------------------------------
     * https://github.com/SteveWinfield/PHP-LG-SmartTV
    **/
    include 'smartTV.php';
    /**
     * Create instance of TV
     * @param IP Address of TV
     * (optional) @param Port of TV (default is 8080)
    **/
    $tv = new SmartTV('192.168.0.11');                                                 // new SmartTV('192.168.2.103', 8080)
    /**
     * Set pairing key (if you don't know the pairing key
     *                    execute the method ..->displayPairingKey() and it will
     *                     be shown on your tv)
     * @param Key
    **/
    $tv->setPairingKey(696850);                                                        // $tv->displayPairingKey();
    /**
     * Authenticate to the tv
     * @except Login fails (wrong pairing key?)
    **/
    $setValueID = (40353 /*[Hausautomation\Entertainment\Archiv\LG-TV\SetValue]*/);    //ID von "SetValue" Script"


    try {
        
    $tv->authenticate();
    } catch (
    Exception $e) {
        die(
    'Authentication failed, I am sorry.');
    }


    //Variablen erstellen
        
    function CreateVariableByName($id$name$type$profile "")
        {
            
    # type: 0=boolean, 1 = integer, 2 = float, 3 = string;
            
    global $IPS_SELF;
            
    $vid = @IPS_GetVariableIDByName($name$id);
            if(
    $vid === false)
            {
                
    $vid IPS_CreateVariable($type);
                
    IPS_SetParent($vid$id);
                
    IPS_SetName($vid$name);
                
    IPS_SetInfo($vid"this variable was created by script #$IPS_SELF");
                if(
    $profile !== "") { IPS_SetVariableCustomProfile($vid$profile); }
            }
            return 
    $vid;
        }

    if (
    $_IPS['SENDER'] == "Execute"){ 

    //VariablenProfile erstellen
        
    IPS_CreateVariableProfile("LG_ChannelList"1);
        
    IPS_CreateVariableProfile("LG_ColorButtons"1);

    //Profilparameter
        //LG_ChannelList
        
    $channels $tv->queryData(TV_INFO_CHANNEL_LIST);
        
    $liste=array(); 
        
    $i=1;
                    
        foreach (
    $channels as $channel) {
        
    $ChName $channel->chname;
        
    settype($ChName,"String");
        
    IPS_SetVariableProfileAssociation("LG_ChannelList"$i$ChName,  "", -1);
        
    $i++;
            If (
    $i == 33){                                             //max Anzahl an Integer Werte
            
    break;
            }

        
        }
        
    //LG_ColorButtons
        
    IPS_SetVariableProfileAssociation("LG_ColorButtons"1".",  ""0xFF0000);
        
    IPS_SetVariableProfileAssociation("LG_ColorButtons"2"..",  ""0x00FF00);
        
    IPS_SetVariableProfileAssociation("LG_ColorButtons"3":.",  ""0xFFFF00);
        
    IPS_SetVariableProfileAssociation("LG_ColorButtons"4"::",  ""0x0000FF);

    //Bool Variablen erstellen
        
    $VariableArrayB = array("bChannelDown""bChannelUp""bVolDown""bVolUp""bChChange""bGetChList""bGetStatus""bMute""bPower");
        
    $Anzahl count($VariableArrayB);
        
    $cnt 0;
        while (
    $cnt $Anzahl)
        {
        
    $VName $VariableArrayB[$cnt];
        
    CreateVariableByName($_IPS['SELF'], $VName0);
        
    $IDVariable = @IPS_GetVariableIDByName($VName$_IPS['SELF']);
        
            
    $eid IPS_CreateEvent(0);                          //Ausgelöstes Ereignis
            
    IPS_SetEventTrigger($eid4$IDVariable);          //Bei Zustand
            
    IPS_SetEventTriggerValue($eidtrue);                 //Nur auf TRUE Werte auslösen
            
    IPS_SetParent($eid$_IPS['SELF']);                 //Ereignis zuordnen
            
    IPS_SetEventActive($eidtrue);                     //Ereignis aktivieren
            
    IPS_SetName($eid,"Trigger");
        
    $cnt ++;
        }

    //Integer Variablen erstellen    
        
    $VariableArrayI = array("iColorButtons""iChannel");
        
    $Anzahl count($VariableArrayI);
        
    $cnt 0;
        while (
    $cnt $Anzahl)
        {
        
    $VName $VariableArrayI[$cnt];
        
    CreateVariableByName($_IPS['SELF'], $VName1);
        
    $IDVariable = @IPS_GetVariableIDByName($VName$_IPS['SELF']);
        
            
    $eid IPS_CreateEvent(0);                          //Ausgelöstes Ereignis
            
    IPS_SetEventTrigger($eid2$IDVariable);          //Bei Grenzüberschreitung
            
    IPS_SetEventTriggerValue($eid0);
            
    IPS_SetParent($eid$_IPS['SELF']);                 //Ereignis zuordnen
            
    IPS_SetEventActive($eidtrue);                     //Ereignis aktivieren
            
    IPS_SetName($eid,"Trigger");
        
        
    $cnt ++;
        }

    //String Variablen erstellen    
        
    $VariableArrayStr = array("strChannelName");
        
    $Anzahl count($VariableArrayStr);
        
    $cnt 0;
        while (
    $cnt $Anzahl)
        {
        
    $VName $VariableArrayStr[$cnt];
        
    CreateVariableByName($_IPS['SELF'], $VName3);
        
    $IDVariable = @IPS_GetVariableIDByName($VName$_IPS['SELF']);
        
    /*        $eid = IPS_CreateEvent(0);                          //Ausgelöstes Ereignis
            IPS_SetEventTrigger($eid, 1, $IDVariable);          //Bei Variablenänderung
            IPS_SetParent($eid, $_IPS['SELF']);                 //Ereignis zuordnen
            IPS_SetEventActive($eid, true);                     //Ereignis aktivieren
            IPS_SetName($eid,"Trigger");
    */
        
    $cnt ++;     
        }
        
    //Profile zuordnen
        
    IPS_SetVariableCustomProfile(@IPS_GetVariableIDByName("iColorButtons",$IPS_SELF), "LG_ColorButtons");
        
    IPS_SetVariableCustomProfile(@IPS_GetVariableIDByName("iChannel",$IPS_SELF), "LG_ChannelList");
    //customAction zuordnen
        
    IPS_SetVariableCustomAction(@IPS_GetVariableIDByName("iColorButtons",$IPS_SELF), $setValueID);
        
    IPS_SetVariableCustomAction(@IPS_GetVariableIDByName("iChannel",$IPS_SELF), $setValueID);
    }



    //zuweisung

    $GetStatusID = @IPS_GetVariableIDByName("bGetStatus"$IPS_SELF);  // Status abfragen
    $ChannelNameID = @IPS_GetVariableIDByName("strChannelName"$IPS_SELF); // Aktueller Sender
    $PowerEventID = @IPS_GetVariableIDByName("bPower",$IPS_SELF);
    //$VolumeEventID = @IPS_GetVariableIDByName("iVolume",$IPS_SELF);
    $MuteEventID = @IPS_GetVariableIDByName("bMute",$IPS_SELF);
    $ChDownEventID = @IPS_GetVariableIDByName("bChannelDown",$IPS_SELF);
    $ChUpEventID = @IPS_GetVariableIDByName("bChannelUp",$IPS_SELF);
    $ChChangeID = @IPS_GetVariableIDByName("bChChange",$IPS_SELF);
    $VolDownEventID = @IPS_GetVariableIDByName("bVolDown",$IPS_SELF);
    $VolUpEventID = @IPS_GetVariableIDByName("bVolUp",$IPS_SELF);
    $ColorButtonsID = @IPS_GetVariableIDByName("iColorButtons",$IPS_SELF);
    $ChannelID = @IPS_GetVariableIDByName("iChannel"$IPS_SELF);

    // Steuerung
    // Mute (toggle)
    if ($_IPS['VARIABLE'] == $MuteEventID)
    {
    $tv->processCommand(TV_CMD_MUTE_TOGGLE);
    }

    // Power (1=Ein, 0=Aus) EIN wird nicht unterstützt
    if ($_IPS['VARIABLE'] == $PowerEventID)
    {
    $tv->processCommand(TV_CMD_POWER);
    }

    // Programm +
    if ($_IPS['VARIABLE'] == $ChDownEventID)
    {
    $tv->processCommand(TV_CMD_CHANNEL_DOWN);
    setValue($_IPS['VARIABLE'], false);
    }

    // Programm -
    if ($_IPS['VARIABLE'] == $ChUpEventID)
    {
    $tv->processCommand(TV_CMD_CHANNEL_UP);
    setValue($_IPS['VARIABLE'], false);
    }

    // Lautstärke +
    if ($_IPS['VARIABLE'] == $VolDownEventID)
    {
    $tv->processCommand(TV_CMD_VOLUME_DOWN);
    setValue($_IPS['VARIABLE'], false);
    }

    // Lautstärke -
    if ($_IPS['VARIABLE'] == $VolUpEventID)
    {
    $tv->processCommand(TV_CMD_VOLUME_UP);
    setValue($_IPS['VARIABLE'], false);
    }

    // Color Buttons
    if ($_IPS['VARIABLE'] == $ColorButtonsID)
    {
        switch (
    getValue($_IPS['VARIABLE'])) {
        case 
    1:
            
    $tv->processCommand(TV_CMD_RED);
            break;
        case 
    2:
            
    $tv->processCommand(TV_CMD_GREEN);
            break;
        case 
    3:
            
    $tv->processCommand(TV_CMD_YELLOW);
            break;
        case 
    4:
            
    $tv->processCommand(TV_CMD_BLUE);
            break;
        }
    setValue($_IPS['VARIABLE'], 0);
    }


    // Zustandsinformationen
    if ($_IPS['VARIABLE'] == $GetStatusID)
    {
    /*
    // Get current volume
        $dummy = $tv->queryData(TV_INFO_VOLUME)->level;
        settype($dummy,"Integer");
        setValue($VolumeEventID, $dummy);
    */    

    // Get current channel Nr.
        
    $dummy = ($tv->queryData(TV_INFO_CURRENT_CHANNEL)->major);
        
    settype($dummy,"Integer");
        
    setValue($ChannelID$dummy);

    // Get current channel name
        
    $dummy = ($tv->queryData(TV_INFO_CURRENT_CHANNEL)->chname);
        
    settype($dummy,"String");
        
    setValue($ChannelNameID$dummy);

    setValue($_IPS['VARIABLE'], false);
    }

    //Auf Programm schalten
    if ($_IPS['VARIABLE'] == $ChannelID)
    {
        
    $channels    $tv->queryData(TV_INFO_CHANNEL_LIST);

        
    // Search for channel $channelName
        
    foreach ($channels as $channel) {
            if (
    $channel->major == GetValue($ChannelID)) {
                
    // Change channel
                
    $tv->processCommand(TV_CMD_CHANGE_CHANNEL$channel);
                break;
            }
        }
    setValue($_IPS['VARIABLE'], false);
    }


    ?>
    SetValue aktion
    PHP-Code:
    <?

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

    ?>
    Geändert von raypancel (30.12.16 um 04:07 Uhr)

  8. #8
    Registriert seit
    Nov 2017
    Ort
    bei Mannheim
    Beiträge
    120

    ich bekomme es nicht hin.

    Warning: include(SmartTV): failed to open stream: No such file or directory in C:\IP-Symcon\scripts\39505.ips.php on line 8

    Warning: include(): Failed opening 'SmartTV' for inclusion (include_path='.;C:\php\pear') in C:\IP-Symcon\scripts\39505.ips.php on line 8

    Fatal error: Class 'SmartTV' not found in C:\IP-Symcon\scripts\39505.ips.php on line 14

    Scripts sind angelegt... hat jemand eine Idee ?

  9. #9
    Registriert seit
    Aug 2012
    Beiträge
    113

    Hast du das Skript als "SmartTV.PHP" benannt?

  10. #10
    Registriert seit
    May 2005
    Beiträge
    255

    Hallo,
    habe das gleiche Problem. Ich glaube, das liegt an dem include-Kommando. Irgendwo hatte ich schon mal was ähnliches, kriegs aber nicht mehr zusammen.
    Gruß
    Jürgen

Ähnliche Themen

  1. Fensterkontakte abfragen
    Von dharmainitiative im Forum KNX/EIB, LCN
    Antworten: 16
    Letzter Beitrag: 02.02.15, 19:49
  2. Button abfragen
    Von stefanhahnen im Forum Skripte, PHP, SQL
    Antworten: 1
    Letzter Beitrag: 10.02.13, 15:55
  3. Boolwert abfragen
    Von wolfgang im Forum Skripte, PHP, SQL
    Antworten: 3
    Letzter Beitrag: 05.08.12, 16:54
  4. Status abfragen
    Von mäc im Forum HomeMatic
    Antworten: 7
    Letzter Beitrag: 10.08.11, 12:06
  5. Aktienkurse abfragen
    Von Doctor Snuggles im Forum Allgemeine Diskussion
    Antworten: 0
    Letzter Beitrag: 22.02.09, 19:02