Jeedom – Contrôler sa SmartTV Samsung

La plupart des TV sont maintenant des « TV connectées ». Généralement, cela veut dire qu’elle propose de récupérer du contenu sur Internet pour apporter « une meilleure expérience », mais elles peuvent également être contrôlées depuis votre smartphone, en passant par le réseau (local) sur lequel elles sont connectées. C’est assez pratique, puisqu’aujourd’hui on a plus facilement notre smartphone sur soi, que l’une des nombreuses télécommandes présentes dans nos foyers (télévision, chaine HiFi, radiateur, clim, magnétoscope – oui, j’en ai encore un! -, lecteur DVD, etc…).

Mais du coup, si nos smartphones peuvent communiquer avec la TV, cela passe par des transmissions réseaux, puisqu’il n’y a pas de port infrarouge sur nos téléphones, ils devraient donc être possible d’envoyer ces « signaux » depuis n’importe quel machine (ordinateur et surtout Raspberry Pi). En cherchant un peu sur Internet, je suis tombé sur le script mis en ligne par Asif IQBAL (http://deneb.homedns.org/things/?p=232). J’ai essayé plusieurs scripts disponibles sur l’Internet, et seul celui-ci a fonctionné avec ma TV, un Samsung UE46F6400). En plus, il a été développé en Python, ce qui est plus simple pour moi, pour le personnaliser.

Il a six paramètres à définir, puis on déclare les « boutons » de la télécommande virtuelle qu’on souhaite activer. On peut même définir un enchainement d’actions. Grâce à cela, j’ai créé un scenario sympathique dans Jeedom, que j’appelle en appuyant sur un seul bouton (un bouton Flic, au passage) :

  1. installé dans mon canapé, j’appuie sur le bouton Flic
  2. Le programme Flic envoie une requête GET, via ma tablette, sur Jeedom pour appeler le scenario « Mode Cinéma ».
  3. Jeedom joue le scenario qui déclenche les actions suivantes
  4. La lumière du salon s’éteint
  5. Les petits spots derrière le canapé s’allument à 10%, pour avoir une ambiance lumineuse
  6. La chaine que je regarde sur la Freebox se met en pause
  7. J’arrive sur la page des applications de la TV
  8. L’application Plex se sélectionne
  9. J’arrive sur l’application Plex
  10. Il ne me reste plus qu’à choisir mon film
  11. La distribution de Pop-Corn n’est malheureusement pas encore d’actualité…

Les parties en rouge sont celles gérées par la télécommande virtuelle.

Réalisation :

Pour la réalisation, je vous dépose ici le script utilisé :


#!/usr/bin/python
# Title: samsungremote.py
# Author: Asif Iqbal
# Date: 05APR2012
# Info: To send remote control commands to the Samsung tv over LAN

import socket
import base64
import time, datetime

tvip = "ADRESSE_IP_DE_LA_TV"
myip = "ADRESSE_IP_DE_JEEDOM"
mymac = "ADRESSE_MAC_DE_JEEDOM"
appstring = "iphone..iapp.samsung" #NE PAS CHANGER#
tvappstring = "iphone.UE46F6400.iapp.samsung" #REFERENCE A CHANGER SUIVANT VOTRE TV#
remotename = "Python Samsung Remote"

# Fonction d'envoi
def sendKey(skey, dataSock, appstring):
messagepart3 = chr(0x00) + chr(0x00) + chr(0x00) + chr(len(
base64.b64encode(skey))) + chr(0x00) + base64.b64encode(skey);
part3 = chr(0x00) + chr(len(appstring)) + chr(0x00) \
+ appstring + chr(len(messagepart3)) + chr(0x00) + messagepart3
dataSock.send(part3);

#Déclaration du socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((tvip, 55000))

#Initiation de la connexion
ipencoded = base64.b64encode(myip)
macencoded = base64.b64encode(mymac)
messagepart1 = chr(0x64) + chr(0x00) + chr(len(ipencoded)) \
+ chr(0x00) + ipencoded + chr(len(macencoded)) + chr(0x00) \
+ macencoded + chr(len(base64.b64encode(remotename))) + chr(0x00) \
+ base64.b64encode(remotename)

part1 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring \
+ chr(len(messagepart1)) + chr(0x00) + messagepart1
sock.send(part1)

messagepart2 = chr(0xc8) + chr(0x00)
part2 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring \
+ chr(len(messagepart2)) + chr(0x00) + messagepart2
sock.send(part2)

#Enchainement de touches - PARTIE A MODIFIER
sendKey("KEY_PAUSE",sock,tvappstring) #Pause de la Freebox#
time.sleep(1) #Attente d'une seconde avant la prochaine touche#
sendKey("KEY_CONTENTS",sock,tvappstring) #Aller sur la page Smart Hub#
time.sleep(4) #Attente de 4 secondes, la page met un peu de temps à charger#
sendKey("KEY_DOWN",sock,tvappstring) #l'icône de Plex est juste en dessous
time.sleep(1)
sendKey("KEY_ENTER",sock,tvappstring) #appui sur la touche Entrée pour valider le lancement de Plex#

# Fermeture du socket
sock.close()

La première fois que vous exécuterez le script, votre TV va vous demander de confirmer que vous autorisez la machine Jeedom à contrôler votre TV. Ensuite, la prochaine exécution du script, sur cette machine, se fera de façon transparente.

Mais maintenant que nous avons notre script qui est fonctionnel, il faut le faire exécuter depuis Jeedom. Pour cela, on utilisera le module Script.

Après avoir déposé le script dans le répertoire « /usr/share/nginx/www/jeedom/plugins/script/core/ressources/ », on le configure comme suit, dans le paramétrage du module :

SamsungPlexJeedom

Vous devez créer autant de scripts que d’enchaînements souhaités. En créant un script pour lancer Plex, un pour arrêter Plex, un pour baisser le volume, un pour augmenter le volume et enfin un pour éteindre la TV, j’arrive à ce visuel dans Plex.

La Samsung Remote dans Jeedom

La Samsung Remote dans Jeedom

Le principal inconvénient de cette solution, mais qui provient de la TV, c’est qu’il n’est pas possible de commander l’allumage de la TV. La télé doit être allumée pour recevoir les ordres. Le seul moyen de domotiser l’allumage de la TV, c’est d’y relier un Raspberry Pi (et oui, encore un) sur l’un des ports HDMI et utiliser le protocole CEC. C’est ce protocole qui allume la TV quand la Freebox est allumée (ou quand du contenu est diffusé via l’un des ports HDMI).

À partir de là, je pense que vous avez toutes les informations nécessaires pour faire vos larves dans le canapé. Bons films!

 

[Mise à jour le 31 janvier 2016]

J’ai oublié de mettre la liste des touches. Vous la trouverez ci-dessous :

#KEY_0 --TOUCHE 0
#KEY_1 --TOUCHE 1
#KEY_2 --TOUCHE 2
#KEY_3 --TOUCHE 3
#KEY_4 --TOUCHE 4
#KEY_5 --TOUCHE 5
#KEY_6 --TOUCHE 6
#KEY_7 --TOUCHE 7
#KEY_8 --TOUCHE 8
#KEY_9 --TOUCHE 9
#KEY_UP --CROIX HAUT
#KEY_DOWN --CROIX BAS
#KEY_LEFT --CROIX GAUCHE
#KEY_RIGHT --CROIX DROITE
#KEY_MENU --TOUCHE MENU
#KEY_PRECH --TOUCHE PRE-CH
#KEY_GUIDE --TOUCHE GUIDE
#KEY_INFO --TOUCHE INFO
#KEY_RETURN --TOUCHE RETURN
#KEY_CH_LIST --TOUCHE CH LIST
#KEY_EXIT --TOUCHE EXIT
#KEY_ENTER --CROIX ENTER
#KEY_SOURCE --TOUCHE SOURCE
#KEY_AD #KEY_PLAY --TOUCHE
#KEY_PAUSE --TOUCHE PAUSE
#KEY_MUTE --TOUCHE MUTE
#KEY_PICTURE_SIZE --
#KEY_VOLUP --TOUCHE VOL +
#KEY_VOLDOWN --TOUCHE VOL -
#KEY_TOOLS --TOUCHE TOOLS
#KEY_POWEROFF --TOUCHE POWEROFF
#KEY_CHUP --TOUCHE PROG +
#KEY_CHDOWN --TOUCHE PROG -
#KEY_CONTENTS --TOUCHE SMART HUB
#KEY_W_LINK #Media P
#KEY_RSS #Internet
#KEY_MTS #Dual
#KEY_CAPTION #Subt
#KEY_REWIND --TOUCHE <<
#KEY_FF --TOUCHE >>
#KEY_REC
#KEY_STOP --TOUCHE STOP

6 Commentaires

  1. 1
    • 2

      Bonjour,
      Tu m’apprends cette information. Je n’en avais pas entendu parler. Si tu fais le test sur une TV plus récente, n’hésite pas à apporter l’information ici. Merci.

  2. 3

    Je dispose d’une Samsung UE55KU6000 et j’ai donc essayé ce script.
    Je précise tout d’abord qu’il y a une erreur d’indentation dans le code (Jeedom me l’a signalé) : lignes 19 à 24 (regarde le code d’origine pour corriger l’erreur).
    Ensuite, concernant ma TV, le port 55000 (comme indiqué à la ligne 28) n’est pas bon, Jeedom me colle une erreur de connexion. J’ai pu trouvé, en fouillant un peu, les ports 8000 et 8001. Le port 8000 me semble adapté pour le socket (voir https://jkry.org/ouluhack/HackingSamsungSmartTV#URL.27s_seen). En changeant ce port, Jeedom ne me signale aucune erreur.

    J’en conclue que le script se réalise correctement, cependant rien ne se fait sur ma TV.
    Malheureusement je ne sais pas comment récupérer différentes valeurs et les étudier.

    Voilà pour mon test… Dommage car je fais du Wake-on-Lan sur la TV et ça marche nickel, mais je ne peux rien faire avec ensuite…!

    • 4

      Hello

      Juste pour information, j’utilise une TV série f9000 avec le kit d’origine j’arrive allumer et éteindre la TV sans problème.
      Tu peux avec la télécommande d’origine mettre ta TV en mode Hôtel, touche ( info, menu, mute) et allumer bouton rouge
      ATTENTION a ne pas faire trop de bêtise une fois dans !
      Par contre, depuis que j’ai installé l’evolution kit 2014, plus possible de gérer la TV même en changeant les ports 🙁

  3. 5
  4. 6

    Bonjour,

    Outre l’aspect hyper intéressant de ceci et très instructif, je me suis permis d’ajouter une fonctionnalité de parse de la ligne de commande qui permet de passer la touche en paramètre.

    Cela notament, dans mon installation domotique, afin de n’avoir qu’un seul script et de gérer la touche depuis l’application appelante :


    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Title: samsungremote.py
    # Author: Asif Iqbal
    # Date: 05APR2012
    # Info: To send remote control commands to the Samsung tv over LAN

    import socket
    import base64
    import time, datetime
    import argparse

    parser = argparse.ArgumentParser(description='Samsung TV Remote script')
    parser.add_argument('key', choices = [
    'KEY_0', # --TOUCHE 0
    'KEY_1', # --TOUCHE 1
    'KEY_2', # --TOUCHE 2
    'KEY_3', # --TOUCHE 3
    'KEY_4', # --TOUCHE 4
    'KEY_5', # --TOUCHE 5
    'KEY_6', # --TOUCHE 6
    'KEY_7', # --TOUCHE 7
    'KEY_8', # --TOUCHE 8
    'KEY_9', # --TOUCHE 9
    'KEY_UP', # --CROIX HAUT
    'KEY_DOWN', # --CROIX BAS
    'KEY_LEFT', # --CROIX GAUCHE
    'KEY_RIGHT', # --CROIX DROITE
    'KEY_MENU', # --TOUCHE MENU
    'KEY_PRECH', # --TOUCHE PRE-CH
    'KEY_GUIDE', # --TOUCHE GUIDE
    'KEY_INFO', # --TOUCHE INFO
    'KEY_RETURN', # --TOUCHE RETURN
    'KEY_CH_LIST', # --TOUCHE CH LIST
    'KEY_EXIT', # --TOUCHE EXIT
    'KEY_ENTER', # --CROIX ENTER
    'KEY_SOURCE', # --TOUCHE SOURCE
    'KEY_AD'
    'KEY_PLAY', # --TOUCHE PLAY
    'KEY_PAUSE', # --TOUCHE PAUSE
    'KEY_MUTE', # --TOUCHE MUTE
    'KEY_PICTURE_SIZE', # --
    'KEY_VOLUP', # --TOUCHE VOL +
    'KEY_VOLDOWN', # --TOUCHE VOL -
    'KEY_TOOLS', # --TOUCHE TOOLS
    'KEY_POWEROFF', # --TOUCHE POWEROFF
    'KEY_CHUP', # --TOUCHE PROG +
    'KEY_CHDOWN', # --TOUCHE PROG -
    'KEY_CONTENTS', # --TOUCHE SMART HUB
    'KEY_W_LINK', # --TOUCHE Media P
    'KEY_RSS', # --TOUCHE Internet
    'KEY_MTS', # --TOUCHE Dual
    'KEY_CAPTION', # --TOUCHE Subt
    'KEY_REWIND', # --TOUCHE <>
    'KEY_REC',
    'KEY_STOP' ]) # --TOUCHE STOP

    args = parser.parse_args()

    tvip = "192.168.0.5"
    myip = "192.168.0.4"
    mymac = "48:5b:39:ab:f7:ad"
    appstring = "iphone..iapp.samsung" #NE PAS CHANGER#
    tvappstring = "iphone.UE46ES6100.iapp.samsung" #REFERENCE A CHANGER SUIVANT VOTRE TV#
    remotename = "Python Samsung Remote"

    # Fonction d'envoi
    def sendKey(skey, dataSock, appstring):
    messagepart3 = chr(0x00) + chr(0x00) + chr(0x00) + chr(len(base64.b64encode(skey))) + chr(0x00) + base64.b64encode(skey);
    part3 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring + chr(len(messagepart3)) + chr(0x00) + messagepart3
    dataSock.send(part3);

    #Déclaration du socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((tvip, 55000))

    #Initiation de la connexion
    ipencoded = base64.b64encode(myip)
    macencoded = base64.b64encode(mymac)
    messagepart1 = chr(0x64) + chr(0x00) + chr(len(ipencoded)) + chr(0x00) + ipencoded + chr(len(macencoded)) + chr(0x00) + macencoded + chr(len(base64.b64encode(remotename))) + chr(0x00) + base64.b64encode(remotename)

    part1 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring + chr(len(messagepart1)) + chr(0x00) + messagepart1
    sock.send(part1)

    messagepart2 = chr(0xc8) + chr(0x00)
    part2 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring + chr(len(messagepart2)) + chr(0x00) + messagepart2
    sock.send(part2)

    #Enchainement de touches - PARTIE A MODIFIER
    #sendKey("KEY_PAUSE",sock,tvappstring) #Pause de la Freebox#
    #time.sleep(1) #Attente d'une seconde avant la prochaine touche#
    #sendKey("KEY_CONTENTS",sock,tvappstring) #Aller sur la page Smart Hub#
    #time.sleep(4) #Attente de 4 secondes, la page met un peu de temps à charger#
    #sendKey("KEY_DOWN",sock,tvappstring) #l'icône de Plex est juste en dessous
    #time.sleep(1)
    #sendKey("KEY_ENTER",sock,tvappstring) #appui sur la touche Entrée pour valider le lancement de Plex#

    sendKey(args.key,sock,tvappstring) #Pause de la Freebox#
    time.sleep(1) #Attente d'une seconde avant la prochaine touche#

    # Fermeture du socket
    sock.close()

    #KEY_0 --TOUCHE 0
    #KEY_1 --TOUCHE 1
    #KEY_2 --TOUCHE 2
    #KEY_3 --TOUCHE 3
    #KEY_4 --TOUCHE 4
    #KEY_5 --TOUCHE 5
    #KEY_6 --TOUCHE 6
    #KEY_7 --TOUCHE 7
    #KEY_8 --TOUCHE 8
    #KEY_9 --TOUCHE 9
    #KEY_UP --CROIX HAUT
    #KEY_DOWN --CROIX BAS
    #KEY_LEFT --CROIX GAUCHE
    #KEY_RIGHT --CROIX DROITE
    #KEY_MENU --TOUCHE MENU
    #KEY_PRECH --TOUCHE PRE-CH
    #KEY_GUIDE --TOUCHE GUIDE
    #KEY_INFO --TOUCHE INFO
    #KEY_RETURN --TOUCHE RETURN
    #KEY_CH_LIST --TOUCHE CH LIST
    #KEY_EXIT --TOUCHE EXIT
    #KEY_ENTER --CROIX ENTER
    #KEY_SOURCE --TOUCHE SOURCE
    #KEY_AD #KEY_PLAY --TOUCHE
    #KEY_PAUSE --TOUCHE PAUSE
    #KEY_MUTE --TOUCHE MUTE
    #KEY_PICTURE_SIZE --
    #KEY_VOLUP --TOUCHE VOL +
    #KEY_VOLDOWN --TOUCHE VOL -
    #KEY_TOOLS --TOUCHE TOOLS
    #KEY_POWEROFF --TOUCHE POWEROFF
    #KEY_CHUP --TOUCHE PROG +
    #KEY_CHDOWN --TOUCHE PROG -
    #KEY_CONTENTS --TOUCHE SMART HUB
    #KEY_W_LINK #Media P
    #KEY_RSS #Internet
    #KEY_MTS #Dual
    #KEY_CAPTION #Subt
    #KEY_REWIND --TOUCHE <>
    #KEY_REC
    #KEY_STOP --TOUCHE STOP

Répondre à SimonT Annuler la réponse

Votre adresse mail ne sera pas publiée. Champs requis *

Vous pouvez utiliser ces balises HTML et attributs: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Vous pourriez être intéressé par