jeudi 10 mai 2012

Intéraction avec HomeAutomate avec URL

Un peu de Réflexion Java pour dialoguer en ligne de commande avec le système HomeAutomate.

Explication : Le but étant d'afficher les informations ou même d’exécuter des méthodes internes à l'aide de commandes URL. (Client en ligne de commande à venir).

Après avoir installé le plugin Réflexion HomeAutomate:






Pré-requis : 


                 J'ai donc configuré 1 device RfxcomEthernet, ainsi que 2 de mes sondes OREGON (après avoir installé les 2 plugins RfxCom & Oregon :






               Après avoir démarré HomeAutomate, on constate dans le Journal de Bord que notre RFXCOM commence à recevoir du message ...






Maintenant, l'objectif étant de récupérer les valeurs températures en interrogeant le système mais sans IHM !
Une Action Struts a donc été déployée dans HomeAutomate, permettant de questionner, intéragir avec les objets (Bean Spring) au sein du système.

Cette action est atteignable via une requête HTTP (Le futur client sera chargé de transformer les paramètres d'un programme en une requête HTTP).

Détails de la requête : 

ObjectAction?action=getUnits&objectName=&objectClass=systemManager&outputFormat=xml

ObjectAction = L'action permettant d’accéder au service d’interaction.

Les paramètres : 

     action : la méthode à invoquer. (Ici on invoque la méthode getUnits() )
    objectName : Permet de récupérer un objet précis (A utiliser dans certains cas, ici pas la peine)
  objectClass : Permet de préciser une Classe d'object prédéfinie (Vocal, System, ...) Si la classe n'est pas trouvée dans la liste définie, on ira alors chercher dans le contexteSpring et trouver le bean spring répondant à ce objectClass. Ici systemManager, signifie que l'on va récuperer le bean spring s'appellant 'systemManager'
    outputFormat(optionnel) : Permet de sérialiser le retour en xml.

 Pour résumer, je demande ici de récupérer toutes les unités (donc les Thn132) connues du système.

Que se passe-t-il en background ? Java va aller chercher l'objet systemManager et rechercher par réflexion la méthode getUnits(), une fois trouvée, il va invoquer la méthode sur l'objet systemManager et sérialiser le retour de la méthode en xml.

Démonstration : 

L'url avec votre navigateur préféré : 




Le résultat (en retour de requête HTTP) en rouge, le nom des sondes et les températures.


     
La sérialisation est effectuée avec une librairie excellente appelée XStream, vraiment trés simple d'utilisation.
XStream xs = new XStream();

textStream = new StringBufferInputStream(xs.toXML(objet));




Voici un petit panel d'exemple de requêtes (avec possibilité de passer des paramètres aux méthodes)



/**
 * <code>
 * Ex:
 * Permet de faire parler le système, ici le paramètre arguments permet de passer les arguments à la méthode  talk qui prends en paramètre le texte à parler. le [null] permet de spécifier la classe du paramètre, permet de  rechercher la méthode adhoc.


 * ObjectAction?action=talk&objectName=&objectClass=vocalManager&arguments=Essai[null]
 * 
 * Permet ici de récuperer toutes les pièces déclarées
 * ObjectAction?action=getAllRoomsName&objectName=&objectClass=houseManager
 *  
 * Permet ici de récuperer toutes les résidences déclarées
 * ObjectAction?action=getAllHousesName&objectName=&objectClass=houseManager
 * 
 * Permet ici de récuperer toutes les résidences déclarées, le prefixe et suffixe, permettent d'enrober chaque ligne par une balise ou autre chaine. utile pour les attributs de type liste.
 * ObjectAction?action=getAllHousesName&objectName=&objectClass=houseManager&prefixe=<option>&suffixe=</option>
 * 
 *  Permet de récupérer tous les managers.
 * ObjectAction?action=getManagers&objectName=&objectClass=systemManager&outputFormat=xml
 * 
 * ObjectAction?action=getUnits&objectName=&objectClass=systemManager&outputFormat=xml
 * 
 * Permet ici de récupérer un plugin à l'aide de son petit nom passé en arguments.
 * ObjectAction?action=getPluginByName&objectName=&objectClass=System&outputFormat=xml&arguments=HomeAutomateReflexionPlugin






     On remarquera lors de la sérialisation que certains attributs (Manager, dao) ne sont pas sérialisés, ils sont en fait déclarés comme transcient car dynamiques. Ils ne doivent pas être sauvegardés en base ni même en xml.


        Il est également possible de récupérer des Streams de type image. En effet , si l'attribut à récupérer est une image ou de l'affichable de type ByteArrayInputStream. L'action se chargera de transformer le retour en image.


Aucun commentaire:

Enregistrer un commentaire