lundi 15 août 2011

Premiers pas vers IHM (Full JAVA) Struts2, JSP & AJAX

Après une longue absence, un petit post pour présenter le projet IHM, les bases du projet Core étant bien avancées.
Et oui l'hiver arrive, et pas question de faire un IHM à l'arrache sous la neige ;)

Bon, plusieurs solutions : 

  1. Un nouveau projet GUI avec communication sur CORE via Services WEB
  2. Un nouveau projet GUI avec dépendance CORE.
  3. Intégration dans le CORE.
Finalement, pour gagner du temps, j'opte pour la solution n°2.
Explications : 
 
    Solution 1 : 

Optimale en terme de dépendance projet, il est tout à fait possible de faire une IHM avec le langage préféré (PHP, .NET, VB, C++, ...), il suffisait simplement de définir des WebServices de dialogue avec CORE équipés de leurs signatures XML lisibles par tout le monde. Une autre piste aurait été de réaliser un autre projet JAVA dédié GUI qui dialoguerait avec ce que l'on appelle des DTO (Data Transfer Object), le projet CORE <<exhibant>> les objets (sous forme d'un projet), ainsi la structure interne du Core peut changer mais pas ce qu'il expose (il assure le contrat de service).
Un peu lourd pour moi, je n'ai pas forcément le temps de tout développer aux petits oignons. A noter que de nombreux outils comme Dozer permettent le "peuplement" automatique d'un objet dans un autre, moyennant un peu de conf xml expliquant le mapping lien : http://dozer.sourceforge.net/



   Solution 2 :

Evidemment, cette solution est plus rapide en terme de développement, on accède directement aux objets du projet CORE sans tout redéfinir. l'inconvénient est que si un objet évolue, on devra par capillarité se taper l'évolution côté GUI. Mais bon, le projet doit être cohérent.

   Solution 3 :

L'intégration directe dans le CORE sans séparation de projet, me semble un peu trop incrustée à mon goût. 

A noter, une version client (en ligne de commande est prévue), pratique lorsque l'IHM rebute un peu. car finalement on peut tout faire en ligne de commande.

Vous l'aurez compris, la solution 2 est engagée.

On commence donc par créer un projet JAVA WEB sous Eclipse : 


On y retrouvera nos sources dans le packages src, les jsp, css, images et autres sous WebContent.
On déclarera les dépendances à l'aide d'un fichier pom.xml. 

Alors pour la partie IHM, on utilisera un Pattern MVC (Model Vue Controller) qui permet de dissocier les écrans, du code, et du modèle. Ce pattern évite que l'on retrouve dans les beans (model) et les traitements (Controller) des morceaux de code liés aux IHM. Pour cela j'utiliserai Struts 2 http://struts.apache.org/2.x/

Contenu du WebContent : 



Nos Jsp seront protégées sous WEB-INF.

Struts utilise un fichier de configuration xml qui détermine les actions (url) possibles sur votre site. Et l'action est redirigée vers une classe java qui retournera SUCCESS généralement, dans le fichier de configuration si success est renvoyé, Struts ira charger la JSP indiquée exemple  :


Ici http://monsite/JdbAction sera redirigé vers JdbAction (Classe POJO), le result (SUCCESS par défaut afichera la jsp jjdb.jsp.

Contenu de src (ne pas tenir compte de beans, devices, ancienne version) :



On y retrouve comme prévu struts.xml à la racine. et sous ihm nous regrouperons nos classes actions (vu au dessus), les interceptors (qui permettent comme leurs noms l'indique d'intercepter n'importe quelle action) utilisation pour la sécurité, on y reviendra plus tard avec security. Servlets en cas de servlets à définir, et enfin tags si des tags sont à prévoir.

Voici donc à qui ressemble l'IHM (pour l'instant hyper sobre): 

  1. Menu type dock Mac en haut 
    1. Home.
    2. Alarme.
    3. Caméra.
    4. Luminaires.
    5. Fermetures.
    6. Températures
    7. ChatAction.
    8. Paramètres.
    9. Déconnexion.
  2. Corps de la fonction utilisée.
  3. Footer contenant les x dernières lignes du JDB (raffraichissement automatique avec AJAX)









Voila le squelette, reste à remplir maintenant, je commencerai par la partie paramètres.

Une petite vidéo de la navigation, assez rapide je trouve :




Une autre vidéo sur la partie JDB dynamique se rechargeant toutes les 10 secondes :




vendredi 3 juin 2011

Changement d'interrupteur Céliane

      Bon, au final les modifications à faire pour relier un interrupteur sans fil DIO semble être trop compliquées pour pas grand chose. Il faudrait faire un petit circuit électronique permettant de générer un contact sec temporisé, bref.

     Je me tourne donc maintenant vers un double poussoir au lieu d'un double interrupteur. Le modèle est strictement identique au double inter, sauf qu'il génère des micros impulsions (suffisantes pour transmettre le signal radio).


      Voici la bête, pratiquement identique au double inter,il faudra donc relier nos switchs aux bornes rouge et blanche.





    Par contre, pour les 4 dips switchs du DIO, il me faudra donc 2 doubles poussoirs, que j'incrusterai dans une double plaque Céliane de ce genre.

Tests en pressant sur les poussoirs (Oh miracle, cela fonctionne)



lundi 2 mai 2011

Matériel : CELION (CELIANE fusion CHACON)

     Comme je le disais dans un post, les interrupteurs CHACON (DIO), ne sont pas trop à mon goût esthétiquement parlant, l'idée m'est donc venue de les fusionner avec un un double inter céliane.

Ancien post : démontage de l'interrupteur CHACON Ici

On commence donc par se procurer un double inter Legrand Céliane




On achète quelques supports de cr232 (Conrad)




Quelques fils de couleur bien choisis




L'arrière de notre interrupteur






On soude le support pile (attention au + et - ) mauvais exemple sur le photo je crois.






On soude le reste des fils  :




Enfin on relie à l'interrupteur :




On teste, l'ensemble :



le souci réside dans l'impulsion, en effet lorsque l'on active un interrupteur, l'un des switchs dip s'active, mais ne se libère pas, du coup lorsqu'il est activé, il est impossible d'activer l'autre voie. et donc seuls 2 signaux peuvent être transmis, pas terrible quand on sait qu'on peut en transmettre 4.

Il va donc me falloir un autre composant capable de me générer une impulsion ou fermer un circuit pendant 1 seconde. En écumant quelques sites d'électronique, je pense que le NE555 pourra faire l'affaire, il faut donc que je modifie le circuit. Cela fera l'objet d'un nouveau post. Car avec ce montage seuls 2 signaux sont transmis.











dimanche 10 avril 2011

Matériel Interrupteur à reconnaissance d'empreinte digitale (Partie 2)

         Je vous avais parlé d'un module de reconnaissance d'empreinte digitale, que je voulais connecter à mon ouverture de porte de garage (Rappel Partie 1), et bien voici la deuxième partie.

L'autre morceau du kit, consiste en un petit module où l'on vient connecter le module d'acquisition (on peut pas se tromper). On viendra ensuite connecter une alimentation (8v ac ou 12v dc au choix), ainsi qu'un contacteur sec (ouvert/fermé). Pour ma part, le contacteur sera relié à mon ouverture Chamberlain, en effet sur ce modèle je peux brancher un simple bouton poussoir et ainsi 'squeezer' les télécommandes 433mhz, ce port fera donc l'affaire.




Côté tableau électrique, j'ai opté pour un transformateur Legrand Lexic , entrée 220v AC, sortie 8 ou 12v AC. Estampillé "FINGER PRINT" ;) (En dessous l'arrivée 220v, sortie en 8v par le dessus).



Vouala donc, notre module branché. et ho ! miracle il fonctionne (bon ok ça fait un peu Terminator) :


Je vous passe l'apprentissage (un peu lourd et surtout mal traduit, j'ai perdu 30 minutes, pas super clair).
Enfin bref voici la vidéo :


Quoi d'autre à dire :

  • Il y a un port rs232 pour contrôler les allées et venues depuis un pc (logiciel windows fourni)
  • Possibilité de relier ça avec l'Arduino du coup, cela fera l'objet d'un épisode 3.


mardi 29 mars 2011

Software : Gestion des plugins dans le projet





          Pour permettre de rendre le système évolutif, il sera possible de fournir dans un répertoire les plugins de HomeAutomateCore.

Les plugins seront représentés sous forme de jar. L'application se chargera au démarrage de "loader" dynamiquement les classes. Pour l'instant les plugins ne peuvent qu'embarquer des managers, mais il sera possible d'embarquer de nouveaux mediators ou encore de nouvelles unités.

Ici un exemple de Plugin (plugin de contrôle de température de la maison)



Règle d'écriture des plugins (Projet Java Simple JAVA tirant une dépendance vers HomeAutomateCore (pour les interfaces).




Et il faudra au minimum une classe qui étendra AbstractManager (du Core) et implémentera les interfaces nécessaires. Dans ce greffon HeatManager.java




Ici, on remarque qu'on implémente IMediatorAware ce qui signifie que dès qu'un mediateur recevra un message, le système routera le message vers ce manager (par l'intermédiaire d'un IDomoticMessage)

L'interface IUnitAware permet quant à elle de recevoir les changements de propriétés sur toutes les unités.

Ces 2 interfaces imposent des méthodes :

    onMessage : permettra d'implémenter ce que l'on veut sur la réception d'un message
    onEvent : idem.

L'interface IManager est obligatoire (implémentation du commentaire du plugin, url, status, mode de démarrage, nom ..)

Une fois le plugin terminé : Export du projet sous forme de jar que l'on colle dans le répertoire indiqué dans la table de paramètre sous la clé pluginDirectory.


samedi 26 mars 2011

Software : Et si on discutait avec notre système domotique ?

      


Quoi de neuf : Google Chrome 11 Béta qui intègre le speech recognition. Intéressant, après avoir essayer plusieurs softs : Dragon, Ibm, finalement un nouveau se présente à la porte et au miracle pas d'autre soft à installer que le navigateur, en plus l'api est directement proposée dans HTML 5 :




      L'idée est donc simple, un textfield html jouera le rôle d'écouter les entrées, puis on redirige le texte reconnu vers une action struts qui sera routée à HomeAutomateCore et plus précisément au manager reconnaissance vocale.

Je vous laisse télécharger chrome pour essayer, mais les résultats sont convaincants et surtout sans apprentissage interminable, bref à intégrer pour pousser le test.

La page de test : 

jeudi 24 mars 2011

Software : Et si on faisait parler notre futur système domotique ?

    L'idée est de rendre communiquant le système, même lorsque l'on est pas devant son écran, portable ...
Donc se faire prévenir par le système que quelqu'un est entré dans l'allée, ou encore qu'un pic de consommation électrique est anormal, tout cela peut nous intéresser.

Je me suis essayé à plusieurs, des softs gratuits avec du copier /coller, des utilitaires en mode ligne de commande, le tts virginie de windows .... bref, toujours à passer par un logiciel tiers à installer sur le PC.

Je suis donc allé voir chez Google et leurs magnifiques services web, et je suis tombé sur Google Translation


Avec une simple URL, on peut se faire dicter du texte dans toutes les langues.


Avantage :


                 Une phonétique plus que séduisante ;)
                 Pas de logiciel à installer en local.
                 Rapide.
                 Choix dans les langues.


Inconvénient : 


                 Connection Internet requise pour traduire.




Allez on y va .... Google Traduction en 1 minute 
Je veux écouter le texte "Monsieur, vous prendrez bien un verre de whisky ! "
Rien de plus simple : faites un copier/coller de cette url dans votre navigateur préféré (N'oubliez pas le son !)

http://translate.google.fr/translate_tts?q=Monsieur, vous prendrez bien un verre de whisky


Pour faire du speech en anglais, il faut ajouter un paramètre dans la request :
Ex : 


http://translate.google.fr/translate_tts?tl=en?q=Baboons are eating some bananas


tl=en pour anglais
tl=fr pour français.
tl=es pour espagnol ...


Implémentation dans le code java :


J'ai donc créé un JDBManager ( qui permet d'ajouter des logs, infos, installation, warning et talk) talk permet non seulement d'écrire dans le journal de bord mais en plus d'appeler un autre manager VocalManager qui va se charger d'aller chercher la traduction de code (Enum) à traduire. Ce dernier se base sur un paramètre la locale de notre application (le multilinguisme est prévu). 

Dans le JDBManager , on a donc la méthode talk qui reçoit en paramètre la classe voulant "talker", un code I18N pour le message, et une liste de paramètres (Au passage fonctionnalité JAVA5)
On pourrait donc passer un message du type 'startSystem %s in %s', new Date(), new Home()
rappel le code passé en paramètre est purement une clé, elle sera traduite à l'aide de notre table i18n lorsqu'on voudra consulter le JDB ou lorsque l'on veut faire parler notre système.

voyons voir la méthode talk du vocalManager :


1. On commence par récupérer dans la table des paramètres la locale (par défaut fr_FR si non renseignée) J'utilise une Enum qui est exploitée dans le parameterManager, Exemple de l'Enum, la valeur par défaut est fournie dans le constructeur.

2.On récupère la traduction du code à annoncer. Si le code n'est pas trouvé dans la table i18n, on retournera le code fourni en entrée.

3.On récupère ensuit le service Google dans les paramètres, il est possible d'utiliser un autre service, dans ce cas on mettra un enregistrement dans la table de paramètre avec comme clé googleSpeech. Par défaut c'est donc notre translate.google.... à notre dans cette url par défaut un %s juste après tl, ce % sera substitué par la locale récupérée.

4.On utilise l'API Apache HttpClient, pour contruire notre requête. ne pas oubliez le User-Agent à positionner ici par défaut à Mozilla, sinon vous allez avoir un belle erreur 403 Forbidden.
Au passage les snippets à ajouter dans le pom :

  <dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>httpcomponents-httpcore</groupId>
<artifactId>jakarta-httpcore</artifactId>
<version>4.0-alpha2</version>
</dependency>


5. Enfin, on éxecute notre requête et on récupère un InputStream qui sera consommé par un Player MP3 récupéré également à l'aide de ce snippet, et c'est tout !

<dependency>
<groupId>de.huxhorn.sulky</groupId>
<artifactId>de.huxhorn.sulky.3rdparty.jlayer</artifactId>
<version>1.0</version>
</dependency>


Une capture de la table de notre JDB :


Et notre table I18N : 


qui contient une clé i18n, une locale et une traduction.


Notre table des paramètres : 




Et vouala, nos futurs managers (Light, Temperature, Consommation) auront à portée de main ce vocalManager en cas de message à faire passer.

Promis j'attaque la prochaine fois un manager Domotique (RFXCOM, ARDUINO ,...)