Extensions XBMC

Cette page wiki se veut être une fiche de suivi interactive du projet "extensions XBMC" d'un groupe d'étudiants de la promotion RICM5 2014. Interactive, car nous suivons pour ce projet une méthodologie de type Agile. Revenez donc régulièrement consulter cette page pour suivre ses dernières évolutions, mises à jour et modifications ! Si le sujet de notre projet vous plaît, que vous avez des questions ou remarques, n'hésitez surtout pas à nous [mailto:xbmc_ricm5@googlegroups.com contacter] :)

=Présentation du sujet=

L'objectif de ce projet de 8 semaines est de créer de nouveaux plugins pour le media center XBMC. Les plugins, qui seront développés, vont permettre d'ajouter les fonctions suivantes :
 * Réalisation d'un plugin de domotique basé sur OpenHab
 * Réalisation d'un plugin d'interaction avec les lampes Philips Hue
 * Réalisation d'un plugin permettant de contrôler des caméras de surveillance D-Link
 * Amélioration de la télécommande Android développée par la "Team-XBMC" :
 * Ajout d'un système permettant de rendre la télécommande réflexive
 * Ajout d'une fonction NFC permettant de lancer de la musique (par genre ou album)

Enfin, si le temps le permet, d'inclure, de tester voire d'implémenter d'autres extensions telles que :
 * commande vocale d'XBMC
 * commande gestuelle
 * implémentation du profil UPnP Low Power
 * suivi d'utilisateurs d'XBMC entre plusieurs instances du logiciel, et ce de manière automatique

=L'équipe projet=

Team:
 * Nicolas Afonso (Chef de projet)
 * Jean-François Bianco
 * Pierre Lartigue
 * Elisa Martinez
 * Rebecca Poustis

= Spécifications =

Plugin OpenHab
Le but de ce plugin est de permettre aux utilisateurs de contrôler leur maison depuis une instance XBMC.

Principe de fonctionnement
 L'utilisateur accède aux informations concernant son logement grâce à un plugin développé spécialement pour XBMC. Grâce à celui-ci, l'utilisateur est en mesure de consulter et d'agir sur les états des objets connectés gérés par son serveur openHAB La communication entre le plugin et le serveur openHab est réalisée à l'aide de l'API REST disponible sur les serveurs openHAB (la connexion utilisée est du type JSON-RPC).

Architecture logicielle
 Le plugin a été développé en Python. Son architecture est décomposée en 3 composants : Les sources sont disponibles sur le dépôt de sources suivant : http://bitbucket.org/xbmcproject/xbmc-openhab-plugin
 * Le premier est l'OpenHab API qui permet de communiquer simplement avec le serveur, et met à disposition les différents types d'objets disponibles dans un serveur openHab.
 * Le second est le Framework PyXBMCt développé par Roman Miroshnychenko. Celui-ci permet de réaliser des interfaces graphiques pour XBMC, directement en python.
 * Le troisième est le composant principal. Il gère l'affichage et l'envoi des requêtes nécessaires pour modéliser l'habitation dans XBMC.

Plugin
L'installation du plugin : 1) Récupérer l'archive zip du plugin : openHab XBMC plugin 2) System -> Addons -> Install from ZIP file -> choose openHab_XBMC_plugin.zip -> Validate

Configuration : Par défaut, le plugin utilise les valeurs suivantes : Ces valeurs sont modifiables dans les paramètres du plugin.
 * Adresse serveur : 127.0.0.1
 * Port du serveur : 8080
 * Nom du serveur : demo
 * Id du serveur : demo

OpenHab
Les détails concernant l'installation d'OpenHab sont disponibles sur le wiki du projet openHab.

Présentation
Nous sommes partis d'un plugin XBMC existant.

Code original : https://github.com/cees-elzinga/script.xbmc.hue.ambilight

Ce plugin implémente le système Ambilight pour les Philips Hue. Ce système capture les couleurs dominantes de l'image du média en cours de lecture et les transmet aux ampoules Hue. Ce qui améliore grandement l'immersion de l'utilisateur.

Amélioration
Nous avons voulu ajouter des effets d'ambiance lorsqu'il n'y a pas de média en cours de lecture. Nous avons donc ajouté un mode d'utilisation des lampes de Philips à savoir le changement de couleur automatique de chaque lampe. Les couleurs sont aléatoires et indépendantes pour chaque ampoule. L'utilisateur peut configurer ce mode selon 3 paramètres : la luminosité, la saturation et la fréquence de changement de couleur des ampoules.

Principe de fonctionnement
 L'utilisateur interagit avec les différentes options du plugin grâce aux settings de celui-ci et sélectionne l'addon pour lancer le script. La communication entre le plugin et le pont Hue est réalisée grâce à l'API Philips.

Architecture logicielle
 Le plugin dispose de 3 fichiers sources python: dominantes d'ambilight, la classe Hue qui représente le pont Hue et la boucle principale du script. communication avec les lampes. Dans ce fichier, sont implémentées des fonctions telles que l'auto-recherche du pont sur le réseau, les méthodes d'envoi des requêtes JSON. les settings saisis par l'utilisateur.
 * default.py qui regroupe les fonctions de calcul de couleurs
 * resources/lib/tools.py définit les fonctionnalités de
 * resources/lib/settingsAmbilight.py qui a pour but de récupérer

L'installation du plugin
1) Récupérer l'archive zip du plugin : extension Philips Hue pour XBMC

2) System -> Addons -> Install from ZIP file -> choose script.xbmc.hue.ambilight.zip -> Validate

3) Configurer les plugins à souhait. Ne pas oublier de faire la recherche automatique du pont Hue sur le réseau si vous ne connaissez pas son adresse IP

Aperçu


Principe de fonctionnement
Nous avons été amenés à travailler sur des caméras de la marque D-Link (les modèles DCS-5222L et DCS-932L).



L'idée de cet addon était de pouvoir utiliser XBMC pour lire le flux video d'une caméra de surveillance. Notre plugin, donne à l'utilisateur de choisir entre deux modèles cités. Au lancement du script, si l'adresse IP de la caméra n'a pas été saisie par l'utilisateur, une recherche du modèle selectionné s'exécute. Une fois le périphérique repéré sur le réseau, le flux video est lu par le lecteur de XBMC via l'adresse HTTP de celui-ci. Le recherche se base sur la recherche d'un périphérique UPnP. Pendant la lecture, un overlay a été créé pour pouvoir contrôlé via XBMC l'un des deux modèles de camera (DCS-5222L). Cela est rendu possible car celles-ci disposent d'un serveur web interne accessible directement sur le port 80, avec l'adresse attribuée dans le réseau local. Les mouvements de la caméras lui sont donc adressés par des requêtes HTTP.

Architecture logicielle
Le plugin dispose de 3 fichiers sources python: script de lancement. l'utilisateur.
 * addon.py regroupe la classe Camera (auto configuration, récupération du flux video), la definition de l'overlay et le
 * resources/lib/camDriver.py regroupe les methodes pour interagir avec la camera.
 * resources/lib/settings.py qui a pour but de récupérer les settings saisis par

Installation
L'installation du plugin :

1) Récupérer l'archive zip du plugin : script.DLinkCameraXBMCAddon.zip

2) System -> Addons -> Install from ZIP file -> choose script.dlinkcameraxbmcaddon.zip -> Validate

Ajout d'une nouvelle caméra
Bien que nous ayons essayé de rendre le plus générique possible notre plugin, nous avons été confronté au problème de non-standardisation des camera D-Link et de l'inexistence de documentation. Nous avons néanmoins essayé de rendre le plus aisé possible l'ajout de nouvelles caméras. Pour ce faire, il faudra isoler deux informations essentielles, qui sont spécifiques à un modèle de caméra :
 * le nom du fichier xml de description utilisé dans les réponses aux sollicitations UPnP: type [path sur serveur][nomfichier].xml
 * l'url d'accès au flux vidéo sur la caméra

Ensuite les ajustements dans le code sont les suivantes :
 * ajouter le choix de cette camera dans les settings du plugin. On ajoute une valeur dans la liste enum d'id "camera_id" dans le fichier settings.xml. Bien sur il faudra indiquer le string correspondant dans le fichier string.xml
 * dans le fichier addon.py, ajouter des constantes CONST_CAM[x]_NAME, CONST_CAM[x]_XML, CONST_CAM[x]_URL, CONST_CAM[x]_ISCONTROLLABLE qui indiquent successivement le modèle de la caméra, le xml de description UPnP, l'url d'accès au flux vidéo et un booléen indiquant si la caméra est contrôlable ou pas. [x] est le numéro de caméra dans la liste.
 * modifier la méthode cameraChosen(self) d'addon.py pour setter les nouvelles constantes en fonction du choix dans les settings du plugin
 * modifier la méthode runvideo en ajoutant la caméra ainsi ajoutée

Télécommande


Noyau
Nous avons étendu l'API JSON-RPC du noyau XBMC :
 * une méthode GetCurrentMainMenu qui permet de retourner l'état actuel de la barre de menu principal. Cet état est loin d'être statique, des nouvelles entrées peuvent apparaître (insertion d'un disque dans la machine où est installée le media center, activation d'une carte tuner TV) ou disparaître (demande explicite de l'utilisateur dans les paramètres d'un skin de ne pas afficher tel ou tel menu). De plus, il est inutile de renvoyer des menus ne contenant aucun média (on ne renvoie pas le menu vidéo si aucune n'est présente dans notre médiathèque).
 * une méthode GetCurrentListDisplayed qui permet d'obtenir la liste de menu actuellement affichée dans XBMC. Seuls les labels des items sont retournés. Si aucune liste n'est affichée (exécution d'un script, lecture de média, settings...), la méthode revoie une liste vide.
 * une méthode NavigateInListItem qui génére un clic sur un item de la liste actuellement affichée à partir de son label placé en paramétre. Cette méthode vérifie si une liste est affichée et, si le paramétre apparait bel et bien dans cette liste. Dans les cas contraires, la méthode renvoie l'erreur InvalidParameter au client.

Télécommande Android
Modifications apportées à la télécommande officielle :


 * Récupération dynamique du menu principal


 * Récupération de la liste des addons


 * Navigation dans les listes à l'intérieur des addons

Exemple d'application :

Interaction avec le noyau de XBMC : 



NFC
Le module NFC ajouté dans la télécommande Android d'XBMC permet de lancer un artiste ou un type de musique.

Principe de fonctionnement


L'utilisateur à la possibilité de lire et d'écrire un TAG NFC depuis la télécommande d'XBMC.

Les TAGs utilisés peuvent être configurés directement depuis la télécommande, qui possède un lecteur NFC. La communication est réalisée avec l'API JSON-RPC disponible sur les instances XBMC.

Architecture logicielle
 L'activité NFCWriterActivity permet de lire et d'écrire les TAGs NFC. La classe NFCWriterController permet d'envoyer les requêtes de lecture au serveur XBMC. L'activité est lancée par la classe HomeController, lorsque l'utilisateur exécute l'activité NFC depuis le menu principal. Le mode lancé dans ce cas est le mode lecture. L'utilisateur doit approcher un TAG pour que celui-ci soit lu, et la lecture lancée. Le mode écriture peut être activé par l'utilisateur dans les menus musique et genre.

Les TAG utilisent la technologie NDEF, et sont configurés de la façon suivante : Lecture album : Lecture genre de musique :
 * Record 0 : Type
 * Record 1 : Id
 * Record 2 : Name
 * Record 3 : Artist
 * Record 4 : Year
 * Record 0 : Type
 * Record 1 : Id
 * Record 2 : Name

Installation
Pour installer l'application Remote XBMC avec nos modifications, il suffit d'installer : 1) la version modifiée de XBMC téléchargeable sur ce [lien] 2) l'apk de la télécommande modifiée disponible sur ce [lien]

Reconnaissance vocale
S.A.R.A.H (Self Actuated Residential Automated Habitat) est un système de maison intelligente connectée à l'internet des objets.



Il permet notamment :
 * reconnaissance vocale et gestuelle via fichiers XML
 * reconnaissance faciale avec une Kinect
 * reconnaissance des QRCodes

Les requêtes HTTP générées exécutent des scripts NodeJS pour l'interaction domotique ou la recherche d'information.

Fonctionnement
Lien vers la description complète : http://encausse.wordpress.com/s-a-r-a-h/s-a-r-a-h-architecture/

L'architecture de SARAH repose principalement sur un programme C# et un programme NodeJS :

Le programme C# : Le programme NodeJS :
 * Ecoute et identifie des phrases, gestes ou qrcode via un fichier XML et génère une requête HTTP
 * Répond à la requête et produit un retour vocal
 * Exécute un script en fonction de la requête HTTP reçue pour exécuter un programme ou chercher de l'information

Prérequis
Lien : http://domotique-info.fr/2014/02/sarah-installation-premiers-pas/
 * Microsoft .NET 4.5
 * Microsoft Speech Platform
 * Speech Platform Runtime
 * SDK Kinect (non nécessaire pour la reconnaissance vocale)

Tutoriel
Lien du tutoriel : http://encausse.wordpress.com/2013/02/16/s-a-r-a-h-tutorial-plugin-xbmc/


 * Télécharger l'archive (version actuelle: 3.1.4) http://encausse.wordpress.com/s-a-r-a-h/
 * Extraire dans un dossier dont le chemin ne comporte pas d'espace
 * Dans le répertoire "plugins", créer un dossier "xbmc"
 * Télécharger l'archive https://github.com/PasDeBol/Sarah-Plugin-Xbmc
 * Copier le contenu du répertoire "plugins" de la nouvelle archive (excepté addonSarahAndXbmc.V1.0.zip) dans le dossier "/plugins/xbmc" précédemment créé
 * Modifier le fichier xbmc.prop :
 * Remplacer "[FIXME]:[FIXME]" par "127.0.0.1:8077"
 * Décompresser l'archive addonSarahAndXbmc.V1.0.zip présente dans "Sarah-Plugin-Xbmc-master/Sarah-Plugin-Xbmc-master/plugins"
 * Copier le répertoire "sarah.addon" dans le dossier "addons" de XBMC

Configuration de XBMC

 * System/Services/Webserver
 * Autoriser le contrôle d'XBMC via HTTP
 * Port : 8077
 * Supprimer le nom d'utilisateur
 * Supprimer le mot de passe
 * System/Services/Remote control
 * Tout autoriser
 * System/System/Video output
 * Mode fenêtré
 * System/System/Audio output
 * Play GUI Sounds : Never


 * Vérification de la configuration
 * "localhost:8077" doit vous rediriger vers l'interface d'XBMC
 * "localhost:8080" doit afficher l'interface web de SARAH
 * Sur l'interface web cliquer sur l'icône "actualiser" du plugin XBMC -> icône "planète" (documentation) -> "Test de la configuration" et vérifier que tous les contrôles soient OK

Exécution

 * Dans l'archive "WSRRelease314", lancer "Server_NodeJS.cmd"
 * Lancer "Client_Microphone.cmd"
 * Pour tester, dire "Sarah, il est quelle heure ?"
 * Si Sarah répond, lancer XBMC
 * Dire "Sarah, active le mode XBMC"
 * À partir d'ici, toutes les commandes de Sarah sont utilisables (récapitulatif ici : https://github.com/PasDeBol/Sarah-Plugin-Xbmc/blob/master/info/liste%20compl%C3%A8te%20des%20commandes.txt)

Ajouter de commandes vocales dans SARAH

 * Ouvrir le fichier "WSRRelease314/plugins/xbmc/xbmc.xml"
 * Ajouter une ligne : (1) out.action.action="(2)" out.action.xbmc="(3)"
 * (1) : la commande vocale que vous souhaitez utiliser (exemple: ferme l'application XBMC)
 * (2) : l'action SARAH correspondant à votre commande

=Dépôts Git=

Dépôt Bitbucket

XBMC modifié Openhab Plugin Reflexive Remote Ambilight Plugin Dlink Addon

Lien vers l'Installateur de notre version d'XBMC modifiée, avec l'ensemble des plugins développés, utilisés (SARAH) et ceux nécessaires à la bonne exécution du tout (plugins dépendants).