Aller au contenu
Gazous

Allumer Et Contrôler Sa Tv Depuis La Hc2 Avec Un Raspberry Pi (Rpi)

Recommended Posts

Bonjour,

 

Je vous propose un petit tutoriel qui m’a permis de pouvoir contourner un problème qui m’ennuyais profondément…

 

Comment allumer ma TV connectée Samsung en veille de manière fiable et économique depuis ma HC2 ?

 

En effet, je dispose d’une TV Samsung modèle UE55D8000 qui a l’avantage comme la plupart des TV connectées de disposer d’une API de pilotage en IP afin de pouvoir la télécommander depuis un smartphone ou autre.

Un plugin Fibaro permet d’ailleurs de piloter une TV Samsung.

Oui mais voilà , car il y a toujours un Mais… En IP, on peut contrôler la quasi totalité des fonctions de la TV à  l’exception d’une, la fonction ON.

Pourquoi ? Et bien tout simplement car Samsung a choisi de faire en sorte que la TV, en veille n’a plus de stack IP active et n’est donc plus à  l’écoute des requêtes de commandes qui se solderons par un Timeout.

Peut-être que depuis ceci a évolué et que les nouveaux modèles sont maintenant à  l'écoute même en veille mais ce n'est pas le cas de mon modèle.

Le seul point positif à  tout ça, c’est que la consommation de la TV en veille est nulle.

C’est déjà  ça mais avec une prise commandée on aurait pu contourner cela pour économiser de l’énergie la nuit par exemple.

Si j’avais une FreeBox Revolution, le problème ne se poserait pas puisque cette dernière est compatible HDMI-CEC et qu’on peut la paramétrer pour que la mise en route de la FreeBox allume la TV.

Malheureusement, la LiveBox Play que j’ai la "chance" de posséder ne gère pas les commandes HDMI-CEC, ce qui m’a par ailleurs amené à  rédiger un autre tuto permettant de mieux la dompter : TV Commande LiveBox Play 

 

Bref, partant de là , j’ai étudié les différentes solutions qui s’offraient à  moi :

     1) Utiliser un boitier Infrarouge pilotable en IP : je ne suis pas trop fan de cela car il devra être posé dans mon salon à  un endroit visible, nécessitant une alimentation, le tout pour un usage unique sachant que je contrôle tous mes autres équipements par radio ou IP. Bof...

     2) Utiliser un boitier spécifique contrôlable en IP et disposant de sorties HDMI CEC ou RS232. En cherchant bien, il existe des boitier spécialisés qui proposent ce type de fonctions mais cela rester onéreux pour simplement allumer une TV

     3) Utiliser mon RPI qui lui est déjà  dans mon meuble TV raccordé à  mon ampli avec kodi.

 

C’est naturellement cette 3ième option que j’ai choisi de mettre en oeuvre non seulement pour le côté pratique et aussi pour économique car dans mon cas, cela n’a nécessité aucun investissement :)

 

Prérequis :

      - Un RPI1 ou RPI2 (j’ai fait le test avec les 2 et ça fonctionne)

      - Quelques notions système unix pour savoir installer une distribution et exécuter les commandes qui vont bien

 

Principe :

     1) le RPI est raccordé en HDMI à  la TV ou à  l’ampli si vous en avez un, peu importe. 

     2) le RPI dispose d’une adresse IP fixe sur votre réseau (réservation d’IP sur votre routeur)

     3) une commande standard HDMI-CEC va nous permettre de donner un ordre d’allumage à  destination de la TV. On utilise pour cela la lib-cec

     4) pour exécuter cette commande depuis la HC2, ce qui est la principale difficulté, je vous propose une petite API PHP que j’ai écrite

 

Je vais donc dans ce tuto vous donner les clés pour configurer votre RPI correctement et vous fournir le code de l’API de contrôle PHP. En bonus, j’ai ajouté à  cette API 2 fonctions pratiques qui vont vous permettre d’éteindre ou de rebooter proprement votre RPI depuis la HC2.

 

Etapes à  suivre :

     1) Installez une distribution linux sur votre RPI1 ou 2 (Raspbian pour faire simple)

 

     2) Installez la lib-cec en suivant un tuto comme celui-ci : https://github.com/Pulse-Eight/libcec/issues/84

     Vous pouvez-vérifier que votre installation est correcte en testant les commandes suivantes : 

echo "on 0" | cec-client -s
echo "standby 0" | cec-client -s

Vous aurez compris que la première doit allumer la TV et la seconde l'éteindre.

 

     3) Installez apache et php en suivant ce tuto : https://www.raspberrypi.org/documentation/remote-access/web-server/apache.md

 

Une fois que vous avez installé tout ça et que tout tourne correctement, voici ce qu’il vous reste à  faire.

 

     4) régler des petits problèmes de droits qui vont permettre au serveur apache du RPI d’exécuter des commandes CEC. Pour cela, exécutez ces 3 commandes:

sudo chmod 777 /var/www
sudo chmod 777 /dev/vchiq
sudo usermod -G video -a www-data

     5) Maintenant, nous allons donner à  apache le privilège de pouvoir exécuter des commandes en tant que root mais sans mot de passe. Ce n’est pas recommandé en terme de sécurité sur un serveur web à  risque mais dans notre cas, cela ne pose pas de problème.

Pour cela, saisissez la commande

sudo visudo

Puis éditer le fichier pour ajouter les lignes suivantes en bleu ci-dessous

 

# User privilege specification

root    ALL=(ALL:ALL) ALL

www-data ALL=(ALL) NOPASSWD:/usr/local/bin/cec-client

www-data ALL=(ALL) NOPASSWD:/bin/echo

www-data ALL=(ALL) NOPASSWD:/sbin/shutdown

 

     6) Dernière petite manipulation et après s’en est fini pour les commandes. Par défaut, lorsque votre RPI va démarrer, il va exécuter une commande HDMI-CEC d’allumage de la TV durant sa phase de boot. Ce n’est pas pour notre cas d’usage le comportement souhaité. Imaginez un coupure de courant en votre absence. La TV s’allumerait automatiquement au re-démarrage… si comme moi vous avez automatisé l’allumage de l’ampli, box TV etc… cela peut vite devenir ennuyeux… Voici ce qu’il faut faire pour éviter cela.

Exécutez la commande suivante qui permet d’éditer la configuration de démarrage de votre RPI :

sudo nano /boot/config.txt

Vous allez normalement trouver la ligne suivante hdmi_ignore_cec_init=1 à  dé-commenter en retirant le # en début de ligne. Sinon, ajoutez là  au fichier et enregistrez le.

 

     7) Installation de l’API PHP

Nous allons ici déployer sur le serveur apache de votre RPI des fichiers PHP qui vont nous permettre d’exécuter à  distance les commandes CEC ou autre.

Pour cela :

     - allez dans /var/www et créez un répertoire à  nommer selon votre convenance « cec » par exemple

     - copiez dans ce répertoire les fichiers php fournis ci-dessous

 

tv_on.php

tv_off.php

shutdown.php

reboot.php

 

     8) Tests : le moment de vérité. Bon maintenant on va voir si tout a bien été installé et configuré… Sur votre ordinateur, ouvrez un navigateur et testez l’URL suivante, TV éteinte : 

 

     http://<ip-de-mon-RPI>/cec/tv_on.php

 

Normalement, votre TV doit s’allumer.

Si ce n’est pas le cas, ne paniquez pas, il doit y avoir un erreur à  récupérer quelque part pour comprendre ce qui ne va pas.

 

     9) Intégration sur la HC2 (ou HCL) : vous l’avez compris, maintenant que cela fonctionne rien de plus simple que d’exécuter un GET comme ceci par exemple pour allumer la TV depuis la HC2

RPI = Net.FHttp("<ip-de-mon-RPI>", 80)
response = RPI:GET("/cec/tv_on.php")
fibaro:debug(response)

A titre d’illustration, je vous joint un Virtual Device et ses icônes, personnalisé à  mes besoins qui me permet de gérer la mise en route/veille de l’ensemble des équipements situés dans mon meuble TV.

 

post-1466-0-63665200-1441629268_thumb.jpg

 

Télévision.vfib

 

Et les icônes correspondant à  ma TV Samsung

 

post-1466-0-42765700-1441629352_thumb.png
post-1466-0-29298100-1441629400_thumb.png

 

J'espère que ce tuto vous rendra service. En ce qui me concerne, il tourne depuis environ 10 mois sans aucun plantage et me permet d'allumer la TV automatiquement le soir lorsque mon épouse rentre à  la maison ou dès que quelqu'un allume la LiveBox.

 

 

 

 

post-1466-0-63665200-1441629268_thumb.jpg

post-1466-0-42765700-1441629352_thumb.png

post-1466-0-29298100-1441629400_thumb.png

  • Upvote 8

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci !! 

 

 

à‡a peut être utile ^^, Je suis justement sur l'allumage automatique.

Même pour moi qui ai une Bbox révolution, la TV accroché au mur c'est pas pratique de tirer 8 mètres de cable HDMI

C'est pénible cette orientation de Samsung de bloqué cette fonction. Enfin bloquer :-)

 

 

En tout cas cool et merci encore une fois

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai aussi ma TV accrochée au mur mais j'ai fait une saignée qui va jusqu'au meuble situé juste en dessous et dans lequel se trouvent tous mes équipements.

Du coup j'ai uniquement besoin de câbles de 2m environ et comme j'ai un ampli, un seul câble HDMI vers la TV suffit.

 

post-1466-0-99519700-1441635171_thumb.jpeg

post-1466-0-64506800-1441635228_thumb.jpeg

Partager ce message


Lien à poster
Partager sur d’autres sites

Sympa le petit coin ;-)

Pour ma part j'ai aucun meuble en dessous car il y a un écran qui descend devant et un meuble gênerait sa descente

Envoyé depuis la Station Spatiale Internationale

Partager ce message


Lien à poster
Partager sur d’autres sites

Ha oui je vois. Moi j'attends de pouvoir acheter l'appartement d'à  côté pour faire une salle de projection  :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Je ne peux que te le souhaiter. On voit mal sur cette photo. Mais ça donne une idée.

Envoyé depuis la Station Spatiale Internationale

Partager ce message


Lien à poster
Partager sur d’autres sites

Le seul problème c'est que avec un port HDMI utilisé le PI ne sort plus de son sur son jack 3,5 :(

Sinon j'aurais fait ca aussi :D

Partager ce message


Lien à poster
Partager sur d’autres sites

On sent les membres du mois qui ce tire la bourre... lol

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Je ne vois pas en quoi c'est un problème kiwi ?

Quel interrêt d'utiliser le jack ?

Tu utilises peut-être ton RPI pour diffuser de la musique en jack ?

Partager ce message


Lien à poster
Partager sur d’autres sites

L'intérêt c'est pour le TTS (voir un autre article que j'ai fait) pour faire l'annonce vocale des trucs qui se passent dans maison :)

Parce, allumer la TV, annoncer "attention les volets se ferment" et l'éteindre... :D

Partager ce message


Lien à poster
Partager sur d’autres sites

A creuser mais il doit certainement y avoir un moyen de forcer ton TTS sortir sur le JACK...

Partager ce message


Lien à poster
Partager sur d’autres sites

Forcer audio vers jack -> sudo amixer cset numid=3 1

Forcer audio vers hdmi -> sudo amixer cset numid=3 2

Audio en mode auto -> sudo amixer cset numid=3 0

Partager ce message


Lien à poster
Partager sur d’autres sites

Ca fait un moment que j'utilise cette méthode pour piloter ma tv.

Si vous voulez d'autres commandes (type changer de source...) je peux fournir.

 

Par contre Gazous dans ton module tu utilises un switch pour obtenir le statut ON/OFF de la TV je comprend pas pourquoi tu ne le fais pas aussi via CEC ??

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour jared,

Les commandes se trouvent facilement avec une simple recherche.

Le but de ce tuto n'est pas de contrôler toutes les commandes de la TV puisque une fois en route elle est accessible en HTTP et donc directement depuis la HC2, ce qui est plus optimisé.

Le but est d'apporter ici une solution pour mettre en route une TV en veille depuis la HC2 ce qui était mon problème.

 

Concernant l'utilisation du switch pour obtenir le statut de la TV, c'est surtout pour détecter un allumage manuel (via la télécommande) de celle-ci en détectant une consommation électrique.

La même chose en CEC ne se ferait pas aussi simplement et nécessiterait de passer par le RPI alors que là  j'ai directement l'information.

Partager ce message


Lien à poster
Partager sur d’autres sites

@jared, si tu as des exemples de commandes que tu utilise je suis preneur. Je n'ai pas encore etudier la solution mais cela m'intéresse de voir les utilisations possible

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Je comprend que c'est un mieux d'utiliser un switch mais en utiliser un juste pour ca, je trouve que ca fait cher !!

 

Autre remarque : toutes les TV ne sont pas controlable en http...

 

Sinon j'utilise quelques commandes que j'avais rassemblé dans le fichier php :

<?php

if(isset($_GET['command'])){
	if ($_GET['command'] == "on") {
		exec('echo "on 0" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "off") {
		exec('echo "standby 0" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "hdmi1") {
		exec('echo "tx 1F 82 10 00" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "hdmi2") {
		exec('echo "tx 1F 82 20 00" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "hdmi3") {
		exec('echo "tx 1F 82 30 00" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "mute") {
		exec('echo "tx 40 44 43" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "volup") {
		exec('echo "tx 40 44 41" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "voldown") {
		exec('echo "tx 40 44 42" | cec-client -s 2>&1', $output);
		print_r($output);
	}
	else if ($_GET['command'] == "state") {
		exec('echo "pow 0" | cec-client -s -d 1|grep power 2>&1', $output);
		$json = implode("\n", $output);
		if (strpos($json, "on") == true) {
			echo "1";
		} else {
			echo "0";
		}
	}
}

?>
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Ha ouimais tunsais j'ai une multiprise zwave dans le meuble TV et il y a 6 prises donc tout est dessus :)

Pour ceux qui n'ont pas,de TV contrôlable en HTTP il,faudrait faire un VD qui implémente toutes les commandes HDMI CEC :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

@gazous:

Salut, je te remercie pour ton tuto que j'ai suivi avec attention.

J'arrive a utiliser les commandes CEC directement avec le RPI mais pas avec les commandes php...

usr/local/bin/cec-client n'existe pas chez moi c'est :

/usr/bin/cec-client

ou

/usr/bin/cecc-client

Je n'arrive pas àtrouver l'erreur...

Une idée peut être? Merci d'avance

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, ce n'est pas grave ça veut dire que ton cec-client s'est installé dans /usr/bin/cec-client

Pour le cecc-client, c'est à  priori une erreur d'installation.

 

Pour que tes commandes en php fonctionne tu devrais essayer de remplacer

www-data ALL=(ALL) NOPASSWD:/usr/local/bin/cec-client 

par 

www-data ALL=(ALL) NOPASSWD:/usr/bin/cec-client

 

Tu l'as peut-être déjà  fait ?

Partager ce message


Lien à poster
Partager sur d’autres sites

oui et pour être sur j'ai testé:

# User privilege specification
root    ALL=(ALL:ALL) ALL
www-data ALL=(ALL) NOPASSWD:/usr/local/bin/cec-client
www-data ALL=(ALL) NOPASSWD:/usr/bin/cec-client
www-data ALL=(ALL) NOPASSWD:/usr/bin/cecc-client
www-data ALL=(ALL) NOPASSWD:/usr
www-data ALL=(ALL) NOPASSWD:/bin
www-data ALL=(ALL) NOPASSWD:/sbin
www-data ALL=(ALL) NOPASSWD:/bin/echo
www-data ALL=(ALL) NOPASSWD:/sbin/shutdown

Partager ce message


Lien à poster
Partager sur d’autres sites

@gazous:

Désolé de te relancer mais quand penses tu?

Je n'arrive toujours pas àfaire de commande en http....

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, pas de soucis. Est-ce que ton serveur apache tourne bien ?

Partager ce message


Lien à poster
Partager sur d’autres sites

×