Remise à niveau plugin TV Phillips (AndroidTV)

Tags: #<Tag:0x00007f592a6d0d50>

Bonjour,

Juste pour avoir la suite qui était sur le Forum, une demande de mise à jour du plugin.
Propriétaire du plugin : @Koleos
Solution de mise à jour : @sbarre35 (je pense car sur le Forum je vois le même avatar mais le nom était sbr :wink: )
Lien vers le Forum : [Plugin Tiers][Sujet Principal] Plugin Tv Phillips

Dernier post du forum :
@sbarre35 a écrit :

Modif du message initial, avec fichiers impactés en rouge ci-dessous suite à un échange avec sebthenul ;-)

J’ai une tv philips sous android, et j’ai mis à jour le plugin afin de pouvoir réaliser l’apairage.

  1. Sur la page de l’équipement, on clique sur le bouton récupérer la clé et la clé est récupérée depuis la tv

  1. La tv affiche le code pin

  1. On ajoute le pin sur la page de l’équipement et sauvegarder

Ci-dessous mes modifs de code pour rendre disponible cette fonctionnalité, j’espère que l’auteur du plugin pourra les intégrer
…code modif plugin (voir post forum).

Puis mon post :

@sbr bonjour,

Je regardes ce que tu as ajouté mais j’ai une question.
desktop/js/tvphillips.php : il n’y a pas ce fichier dans js, ne serait ce pas plutôt dans desktop/php/tvphillips.php ?
Dans la même partie :
Tu as oublié de mettre [/code] après le :
<!-- Ligne 164 : Fin Ajout sbr --> ICI

Si je reprends :

desktop/js/tvphillips.js

/* Ligne 660 : Debut Ajout sbr */

function getKey( ) {

  $('.eqLogicAttr[data-l1key=configuration][data-l2key=user]').val(Date.now()); 
    
  $.ajax({
        url: "plugins/tvphillips/core/ajax/tvphillips.php",
        dataType: 'json',
    	type: 'post',
    	data: { 
          "action" : "pair",
          "ip" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=IPaddress]').val(),
          "user" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=user]').val() 
        },
    	complete : function(resultat){ 
          
           	console.log("*** COMPLETE ***");
            
          	console.log(resultat);
          
            var data = JSON.parse(resultat.responseText);        
          
            var obj = JSON.parse(data.result);  
          
            console.log(obj);
          
          	if( obj.error_id == "SUCCESS" ) {
              
            	$('.eqLogicAttr[data-l1key=configuration][data-l2key=auth_key]').val( obj.auth_key );
                $('.eqLogicAttr[data-l1key=configuration][data-l2key=timestamp]').val( obj.timestamp );
                $('.eqLogicAttr[data-l1key=configuration][data-l2key=timeout]').val( obj.timeout );
              
			} 
          
        }		
  });

}

function getToken( ) {

  $.ajax({
        url: "plugins/tvphillips/core/ajax/tvphillips.php",
        dataType: 'json',
    	type: 'post',
    	data: { 
            "action" : "grant",
            "ip" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=IPaddress]').val(),
            "pin" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=pin]').val(), 
            "timestamp" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=timestamp]').val(),
            "user" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=user]').val(),
            "auth_key" : $('.eqLogicAttr[data-l1key=configuration][data-l2key=auth_key]').val()
        },
    	complete : function(resultat){ 
          
           	console.log("*** COMPLETE ***");
            
          	console.log(resultat);
          
          	var data = JSON.parse(resultat.responseText);        
          
            var obj = JSON.parse(data.result);  
          
            console.log(obj);
          
          	if( obj.error_id == "SUCCESS" ) {
              
            	$('.eqLogicAttr[data-l1key=configuration][data-l2key=auth_key]').val( obj.auth_key );
                $('.eqLogicAttr[data-l1key=configuration][data-l2key=timestamp]').val( obj.timestamp );
                $('.eqLogicAttr[data-l1key=configuration][data-l2key=timeout]').val( obj.timeout );
              
			} 
          
        }		
  });

}

/* Ligne 739 : Fin Ajout sbr */

desktop/php/tvphillips.php

<!-- Ligne 127: Debut Ajout sbr -->
<div class="form-group" style="display: none">
    <label class="col-sm-2 control-label">{{Utilisateur}}</label>
    <div class="col-sm-3">
<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='user' />
    </div>
</div>
<div class="form-group">                    
    <label class="col-sm-2 control-label">{{Clé}}</label>
    <div class="col-sm-3">
<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='auth_key' readonly/>
    </div>
    <div class="col-sm-1">
        <a class="btn btn-danger eqLogicAction" onclick="getKey()"><i class="fa fa-minus-circle"></i> {{Récupérer une clé}}</a>
    </div>
</div>
<div class="form-group" style="display: none">                    
    <label class="col-sm-2 control-label" style="display: none">{{Timestamp}}</label>
    <div class="col-sm-3">
<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='timestamp' readonly/>
    </div>
</div>
<div class="form-group" style="display: none">                    
    <label class="col-sm-2 control-label">{{Timeout}}</label>
    <div class="col-sm-3">
<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='timeout' readonly/>
    </div>
</div>
<div class="form-group">                    
    <label class="col-sm-2 control-label">{{Pin}}</label>
    <div class="col-sm-3">
<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='pin' />
    </div> 
    <div class="col-sm-1">
        <a class="btn btn-danger eqLogicAction" onclick="getToken()"><i class="fa fa-minus-circle"></i> {{Appairer la tv}}</a>
    </div> 
</div>
<!-- Ligne 164 : Fin Ajout sbr -->

core/class/tvphillips.class.php

/* Ligne 828 : Debut Ajout sbr */
        
        $user = $eqLogic->getConfiguration('user');
        $auth_key = $eqLogic->getConfiguration('auth_key');
      
        if( $user != "" ) {
          
        $IPaddress = $eqLogic->getConfiguration('IPaddress');
        $key_data  = $this->getConfiguration('key_data');
        $api_type  = $this->getConfiguration('ApiType');

        $request1 = "curl --digest -u".$user.":".$auth_key." -X POST https://";
        $request4 = '"}';
        $request5 = "'";

        switch($api_type) {
        
          case 'key':
            
            $request2 = ":1926/6/input/key -v -k -d '{";
            $request3 = '"key":"';
          
            break;
          
          case 'volume':
            
            if ($_options !== null && $_options !== '') {
              $options = self::cmdToValue($_options);
              if (is_json($_options)) {
                $options = json_decode($_options, true);
              }
            } else {
              $options = null;
            }
            
            if (isset($options['volume'])) {
              $request2 = ":1926/6/audio/volume -d '{";
              $request3 = '"muted": false,"current":"';
              $key_data = $options['volume'];
            }
            
            break;

          case 'sources':
            
            $request2 = ":1926/6/sources/current -d '{";
            $request3 = '"id":"';
            
            break;
            
          default:
          
            break;
        
        }

        $request = $request1.$IPaddress.$request2.$request3.$key_data.$request4.$request5;
        $request_shell = new com_shell($request . ' 2>&1');
        $result = trim($request_shell->exec());

        return $result;
      
        } else {
          
        /* Ligne 892 : Fin Ajout sbr */

et

	/* Ligne 938 : Debut Ajout sbr */
        
	 }
      
	/* Ligne 942 Fin Ajout sbr */

Puis créer un dossier ajax dans core, un fichier txt que l’on nomme tvphillips.php puis y copier ce qui suit :

core/ajax/tvphillips.php

<?php

/* This file is part of Jeedom.
 *
 * Jeedom is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Jeedom is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Jeedom. If not, see <http://www.gnu.org/licenses/>.
 */

try {
    require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php';
    include_file('core', 'authentification', 'php');

    if (!isConnect('admin')) {
        throw new Exception(__('401 - Accès non autorisé', __FILE__));
    }

    if ( init('action') == 'grant' ) {
      
		$input = '{ "auth" : { "auth_AppId" : "1" , "pin" : "' . $_POST['pin'] . '" , "auth_timestamp" : "" , "auth_signature" : "" } , "device" : { "device_name" : "heliotrope", "device_os" : "Android", "app_name" : "ApplicationName", "type" : "native" , "app_id": "app.id" , "id" : "' . $_POST['user'] . '" } }';
  
        $ch = curl_init();
  
      	$ip = init('ip');
      
        curl_setopt($ch, CURLOPT_URL, "https://".$ip.":1926/6/pair/grant");
      	curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
        curl_setopt($ch, CURLOPT_USERPWD, $_POST['user'] . ":" . $_POST['auth_key']);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $input ); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Accept: application/json' ));
  
  		$output = curl_exec($ch);
  
  		$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  
  		curl_close($ch);
      
  		ajax::success($httpcode);

	} else if ( init('action') == 'pair') {
      
    	$input = '{ "scope" :  [ "read", "write", "control"] , "device" : { "device_name" : "heliotrope", "device_os" : "Android", "app_name" : "ApplicationName", "type" : "native" , "app_id": "app.id" , "id" : "' . $_POST['user'] . '" } }';
  
        $ch = curl_init();

      	$ip = init('ip');
      
        curl_setopt($ch, CURLOPT_URL, "https://".$ip.":1926/6/pair/request");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $input ); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Accept: application/json' ));

        $output = curl_exec($ch);

        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        curl_close($ch);

        ajax::success($output);
      
    }
    
	throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action'));
  
} catch (Exception $e) {
  
    ajax::error(displayExeption($e), $e->getCode());
  
}
  
?>

Tu pourras me corriger si je me suis planté ?
Merci @sbr

@Koleos Bonjour,
Je me prépares à recevoir mon super cadeau de nöel ;) une Philips OLED :lol:
J’ai donc besoin de ce plugin pour gérer l’extinction (mise en vieille) de mon ‘joujou’. Je ne pourrai plus éteindre comme je fais actuellement avec mon ancienne TV via une prise (On/Off) avec Homebridge et Siri. Les OLED doivent être mis en vieille, pas coupé net…Donc ce super plugin va me permettre (j’espère) de mettre en vieille via Siri… D)
Peux-tu faire les modifs dans ton plugin ? Et si possible le mettre compatible V4 ? 8-)

Voilà, comme cela on ne perdra pas le fil.

@koleos , @sbarre35 ,
J’ai des erreurs sur la V3 (php) avec le plugin lors de la sauvegarde. Avez-vous la même chose ?
info qui apparait en début de sauvegarde :

PHP Warning:  Declaration of tvphillips::toHtml($_version) should be compatible with eqLogic::toHtml($_version = 'dashboard') in /var/www/html/plugins/tvphillips/core/class/tvphillips.class.php on line 0

merci

Salut à tous,

Moi j’ai une erreur 500 sur le Dashboard… quand j’ajoute l’objet.
Ça marche pour certains ?

Bod

1 J'aime

Ah ben… Ayant une TV Philips sous Android, il
faut que je teste.
Je vous tiendrais au courant.

Je l’a contrôle déjà via Alexa.

Bonjour,
J’ai reçu ma tv philips (android), le plugin fonctionne (juste on/off, enfin Off puisque qu’il n’y a qu’une action (standby) tu clique une fois on, une deuxième fois off.
Avant, j’avais une prise zwave (on/off), j’avais mis la tv et l’ampli+caisson etc… dessus.
Avec homebridge, siri m’allumait la tv ou l’éteignait.
Avec ma new TV (oled :wink: ), ce n’est plus possible, donc le plugin transformé me donne une action que j’associe à ma prise, et si je parle à siri, il allume/éteint la prise et dans les actions on et off de la prise (dans configuration de l’action), j’ai mis l’action standby du plugin
Test en cours. il faut aussi que je test sur la v4

Voilà tout fonctionne en v3, par contre en v4 rien, problème de class object donc pas de plugin tv Phillips fonctionnel dans multimedia
Je cherche la doc des comment fait un plugin en v4 pour comprendre ce class object ( si je peux comprendre)

Salut,

Pourtant les sujets ne manquent pas la-dessus… il faut remplacer les “object” dans le code php par “jeeObject”.

Tu a fait des modifications particulières pour le faire marcher ?

Ok ok je commences juste à regarder mais merci pour l’info je vais cibler :wink:
Donc cEla ne va pas être trop compliquer de faire ces remplacement je vais tester

Oui, celle que j’ai reprise sur le forum et que j’ai mis en tête de ce post

Ok, moi avec ces modifications ça ne marche pas en V4.
J’ai déjà changé la class object

Ah, en v3 nickel, donc moi je suis encore à la première étape en v4, problème de class object, je vais faire les remplacement puis je vais arriver ton blocage :wink:

Ok, j’ai hâte d’avoir ton retour :grin:

Vu, j’ai trouvé ton post, avec jeeObject (c’était le mot magique), petite précision, dans tous les .php, je remplace object par jeeObject ?
exemple :

if ($_version == 'dview') {
            $object = $this->getObject();
            $replace['#name#'] = (is_object($object)) ? $object->getName() . ' - ' . $replace['#name#'] : $replace['#name#'];

devient

if ($_version == 'dview') {
            $jeeObject = $this->getjeeObject();
            $replace['#name#'] = (is_jeeObject($jeeObject)) ? $jeeObject->getName() . ' - ' . $replace['#name#'] : $replace['#name#'];

J’ai un doute avec le getObject…

Non ! Uniquement object
Même ton second object faut pas le remplacer d’après moi.

Il y en a qu’un par plugin en général

Ok, donc uniquement object:: (et oui, 1 seul dans le .php)

Ok donc effectivement, avec jeeObject, j’ai maintenant accès à la page du plugin, j’ai cliqué sur ajouter TV, mis le nom, puis OK et bBIM : message erreur ;

[MySQL] Error code : 22007 (1366). Incorrect integer value: '' for column `jeedom`.`cmd`.`isVisible` at row 1 : INSERT INTO `cmd` SET `id` = :id, `logicalId` = :logicalId, `generic_type` = :generic_type, `eqType` = :eqType, `name` = :name, `order` = :order, `type` = :type, `subType` = :subType, `eqLogic_id` = :eqLogic_id, `isHistorized` = :isHistorized, `unite` = :unite, `configuration` = :configuration, `template` = :template, `display` = :display, `value` = :value, `isVisible` = :isVisible, `alert` = :alert

Je pense donc que c’est plus grave Docteur :wink:
aller, je vais cherché…
Je suis sur que c’est le css (partie widget) qui pose problème ou alors il faut juste changer ‘subType’ par :subType etc…
Je vais voir. Mais @Bod ne t’attends pas à des miracles, je n’y connais absolument rien en php, css, html, js etc… trop de ,;.[({$€ pour moi… € oui il n’y en a pas :grin:
Mais la logique de programmation, de variable, les termes cmd, get, post etc… et le fait que je ‘sens’ le logiciel au bout d’un moment, me permet de fouiner et de trouver des trucs.

Je vais décortiquer le plugin Bravia car je suis sur que c’est le même principe (ip tv + code fonction)

Bon, trop compliqué pour moi, le top serait que quelqu’un reprenne le code pour l’adapter en v4 (le code mais surtout tout le plugin) car il marche en v3.

Dommage… j’espère que quelqu’un a prévus d’acheter une ambilight pour noël :grin: