Piloter une TV Philips ambilight récente par ligne de commande

Les TV Philips récentes sous Android TV (> 2016) utilisent une API basée sur JointSpace

C’est beau tout de même!

MAIS, pour faire simple, Philips a décidé de masquer cet API via d’une part un changement de port, l’utilisation du https au lieu du http… et en prime, cela nécessite un appairage, intégré aux applications philips… Mais pas accessible ailleurs.

Heureusement, il existe sur github un script permettant de réaliser « facilement » cet appairage. Enfin, facilement…

https://github.com/suborb/philips_android_tv

Je vais décrire le process pour installer ce script.

Prérequis

  • Avoir un pc / serveur (linux de préférence) avec python d’installé.
  • Avoir git d’installé : rappel sur ubuntu
sudo apt-get install git

  • Connaître l’adresse IP de votre télé philips. Si vous ne la connaissez pas, elle est indiquée dans le menu android!

Installation du script et appairage

Sur votre PC/Serveur, dans le dossier de votre choix, on commence par récupérer le script :

git clone https://github.com/suborb/philips_android_tv.git <votre_dossier>
cd <votre dossier>

ensuite, on installe les pré-requis du scripts :

sudo pip install -r requirements.txt

Il faut ensuite démarrer votre téléviseur puis lancer l’appairage de votre TV via le script

python philips.py --host <adresse IP Philips TV> pair

Le script vous demande un code affiché à l’écran, puis il va vous fournir un utilisateur et un mot de passe. Ces deux éléments sont essentiels et à conserver absolument. Rassurer vous, on peut toujours relancer l’appairage si on les oublie…

Utilisation du script

On peut utiliser le script pour récupérer des infos … mais surtout réaliser quelques actions (limitées… très limitées…)

Pour cela on exécute le script ainsi :

python philips.py --host <adresse IP TV> --user <VOTRE USER> --pass <VOTRE PASS> <command>

Avec <command> ayant pour valeur possible : get_volume, get ou standby

Bon, le script est pas super complet… Donc, j’ai réalisé quelques modifications pour avoir quelques commandes supplémentaires.

Sur demande, je peux fournir un patch… en attendant, faute de mieux, remplacer les lignes > 99

if args.command.startswith("get"):
if args.command == "get_ambilight_cached":
config['path'] = "6/ambilight/cached"
elif args.command == "get_ambilight":
config['path'] = "6/ambilight/currentconfiguration"
elif args.command == "get_ambilight_mode":
config['path'] = "6/ambilight/mode"
elif args.command == "get_ambilight_topology":
config['path'] = "6/ambilight/topology"
elif args.command == "get_applications":
config['path'] = "6/applications"
elif args.command == "get_channeldb_tv":
config['path'] = "6/channeldb/tv"
elif args.command == "get_channeldb_channellists":
config['path'] = "6/channeldb/tv/channelLists/all"
elif args.command == "get_menuitems_settings":
config['path'] = "6/menuitems/settings/structure"
elif args.command == "get_powerstate":
config['path'] = "6/powerstate"
elif args.command == "get_recordings":
config['path'] = "6/recordings/list"
elif args.command == "get_system":
config['path'] = "6/system"
elif args.command == "get_system_epgsource":
config['path'] = "6/system/epgsource"
elif args.command == "get_system_storage":
config['path'] = "6/system/storage"
elif args.command == "get_system_timestamp":
config['path'] = "6/system/timestamp"
elif args.command == "get_volume":
config['path'] = "6/audio/volume"
else:
print("Invalid get command (see source for details)")
return
get_command(config)
if args.command.startswith("post"):
if args.command == "post_standby":
config['path'] = "6/input/key"
config['body'] = { "key" : "Standby" }
elif args.command == "post_home":
config['path'] = "6/input/key"
config['body'] = { "key" : "Home" }
elif args.command == "post_mute":
config['path'] = "6/input/key"
config['body'] = { "key" : "Mute" }
else:
print("Invalid post command")
return
post_command(config)
main()

Cela me permet d’avoir des commandes intéressantes du point de vue domotique

  • post_standy => arrêt / mise en route de la télé
  • post_home => mise en route du menu home
  • post_mute => mute …
  • get_powerstate => status de la télé (allumée, eteinte)

Bon, après tout ça, c’est TOUJOURS pas user friendly, mais ça permet d’interroger la télévision, de lui demander de s’allumer, de s’éteindre…

Mais ensuite, il reste à intégrer tout ça dans Jeedom, et cela fera partie d’un deuxième article.

Inspiration du week-end en domotique

Voici quelques liens vers des articles pour donner des inspirations dans la réalisation de scénarios de domotique.

La surveillance des équipements c’est l’un des points faibles de Jeedom qui n’informe pas si un capteur est « hors ligne ». Voilà une méthode utile et pas trop complexe pour faire remonter l’info. Attention, cela nécessite au préalable un plugin de messagerie configuré.

Quand on est dans la cuisine et qu’on a besoin d’aller à la réserve, c’est souvent qu’on a quelque chose dans les mains… Et ouvrir une porte, ça devient compliqué. Heureusement, Sarakha63 à la solution une porte « magique » et totalement intégrée dans la cuisine. 

Les Yeelights sont des lampes Wi-Fi très bien pensé, pas cher, fiable et pratique. On peut les utiliser assez facilement dans Jeedom… Mais comment faire appel aux scènes Yeelight sans les recréer « à la main » ? Via le plugin IFTTT. Pas forcément simple… mais pratique.

Avoir un aquarium, c’est bien, ça fait jolie, mais cela nécessite une surveillance accrue pour détecter les problèmes de l’eau (température, trop haute, trop baisse, ph, etc.). Et si la domotique venait nous aider? C’est le principe de Reef-pi, avec un ensemble de tutoriaux.

Bon week-end à tous!

Proxifié octoprint derriere un serveur apache

Suite à l’ajout d’une webcam sur notre octoprint, très vite nous avons voulu pouvoir contrôler à distance le résultat du travail. Sauf que… on a déjà un serveur web tournant sur une autre machine.

Deux méthodes sont alors possibles : soit rediriger l’accès via un autre port En utilisant des redirections dans la box internet via, par exemple 8080 => <adresse ip host octoprint:80>

Mais pas idéal quand on a un nom de domaine, et puis on oublie assez vite le numéro de port… Donc, je me suis basé sur le tutorial suivant, dans la version adapté à Apache.

https://discourse.octoprint.org/t/reverse-proxy-configuration-examples/1107

Mais… l’exemple indiqué ne fonctionne pas si apache est installé sur un autre poste que le raspberry pi.

Voici une version corrigée :

<Location /octoprint/>
ProxyPass http://<adresse ip host octoprint>/
ProxyPassReverse http://<adresse ip host octoprint>//
RequestHeader set X-SCRIPT-NAME /octoprint/
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://<adresse ip host octoprint>/:80%{REQUEST_URI} [P]
</Location>