Contrôler sa piscine depuis un smartphone

Contrôler sa piscine depuis un smartphone

Si vous possédez une piscine enterrée vous avez probablement un système de sécurité pour éviter les noyades. Une des solutions possible est l'installation de volets roulants, mais souvent ces systèmes ne sont contrôlables que depuis un interrupteur. Cette semaine nous allons voir comment contrôler une installation de ce type depuis votre smartphone.




Le volet roulant de cette piscine est commandé par un interrupteur à clef depuis un coin du jardin. L'électronique de contrôle des moteurs est installée dans une cabane de jardin qui abrite aussi les pompes et filtres de la piscine. L'électronique de contrôle fonctionne en 24 Volts et possède deux entrées (pour les états "fermé" et "ouvert") qui sont tenues à l'état neutre avec un "pull down". Lorsqu'on branche le 24 Volts sur l'entrée "fermé" le volet se ferme, et à contrario lorsque l'on branche le 24 Volts sur l'entrée "ouvert" il s'ouvre. L'électronique détecte la fin de course du rideau et stoppe automatiquement le moteur à la fin de l'opération. L'interrupteur à clef ne fait que commuter une source 24 Volts de l' entrée "fermé" à "ouvert".

Le cablage d'origine
Le cablage d'origine



Pour contrôler ce système il existe plusieurs solutions. La plus simple est de remplacer l’interrupteur à clef par un Yocto-PowerRelay. Cette solution est simple et peu onéreuse, mais on perd la possibilité de contrôler la piscine sans smartphone. La solution la plus chère est d'ajouter un Yocto-Maxi-IO à la solution précédente pour connaître la position de la clef. Cette solution est complète car on peu ainsi déterminer à tout moment la position de la clef et la "position virtuelle" du smartphone, mais elle nécessite par contre qu'un PC soit allumé en permanence pour surveiller l'état de la clef pour basculer le relais dans la bonne position.

La solution intermédiaire est d'utiliser un Yocto-Relay qui inclus deux relais. Le premier relais est utilisé pour désactiver l’interrupteur à clef et le deuxième est utilisé pour envoyer les commandes au contrôleur de volet. C'est cette solution que nous allons utiliser.

Le cablage une fois le Yocto-Relay installé
Le cablage une fois le Yocto-Relay installé



Comme on le voit dans le schéma, la source 24V arrive sur le relais 1 et est redirigée soit sur l'interrupteur à clef (état A) soit sur l'entrée du relais 2 (état B). Les sorties du relais 2 sont branchées en parallèle avec les sorties de interrupteur à clef. Avec ce câblage il est possible de "désactiver" l’interrupteur à clef en basculant le relais 1 sur la position B et d'envoyer le 24V sur la bonne entrée du contrôleur de volet à l'aide du relais 2. Dans cet état l'entrée de interrupteur à clef n'est plus connecté au système.

Pour ouvrir la piscine il faut basculer le relais 1 sur la position B (clef désactivée) et basculer le relais 2 sur la position A (piscine ouverte). Pour fermer la piscine il faut basculer le relais 1 sur la position B (clef désactivé) basculer le relais 2 sur la position 2 (piscine fermée). Il faut aussi prévoir une troisième commande "Libérer" pour réactiver l’interrupteur à clef, sinon une fois que le baigneur à fermé ou ouvert la piscine avec son smartphone, la clef restera désactivée.

Bien évidement nous ne voulons pas avoir à brancher un câble de notre téléphone au relais chaque fois que l'on veut aller se baigner. Nous allons brancher le Yocto-Relay sur un YoctoHub-Ethernet pour le rendre accessible par n'importe quelle machine connectée sur le réseau local. Ainsi on pourra contrôler notre système depuis notre smartphone en utilisant la connexion WiFi.

Le YoctoHub-Ethernet et le Yocto-Relay sont cachés dans le coin du panneau de contrôle
Le YoctoHub-Ethernet et le Yocto-Relay sont cachés dans le coin du panneau de contrôle



Pour contrôler la piscine nous allons écrire une application Android qui aura trois boutons

  • Ouvrir
  • Fermer
  • Libérer

Comme toujours avec Android le code qui doit accéder au réseau ne peut pas être exécuté depuis le thread principal. La solution la plus simple est d'implémenter une AsyncTask qui prend en paramètre la commande à exécuter (Ouvrir, Fermer, Libérer) et qui retourne l'état du système.

public class YoctoTasks extends AsyncTask<Integer, String, String> {
    public static final int GET_POOL_STATE = 2;
    public static final int CLOSE_POOL = 3;
    public static final int OPEN_POOL= 4;
    public static final int RELEASE_POOL = 5;
    public static final String RESULT_RELEASED = "RELEASED";
    public static final String RESULT_OPEN = "OPEN";
    public static final String RESULT_CLOSE = "CLOSE";
    private YRelay pool_key;
    private YRelay pool_control;

    @Override
    protected String doInBackground(Integer... cmd)
    {
        String res = "";        
        try {
            YAPI.RegisterHub("http://192.168.0.123");
            pool_key = YRelay.FindRelay("pool_key");
            pool_control = YRelay.FindRelay("pool_control");
            switch (cmd[0]) {
                case GET_POOL_STATE:
                    res = getPoolState();
                    break;
                case CLOSE_POOL:
                    pool_key.set_state(YRelay.STATE_B);
                    pool_control.set_state(YRelay.STATE_A);
                    res = getPoolState();
                    break;
                case OPEN_POOL:
                    pool_key.set_state(YRelay.STATE_B);
                    pool_control.set_state(YRelay.STATE_B);
                    res = getPoolState();
                    break;
                case RELEASE_POOL:
                    pool_key.set_state(YRelay.STATE_A);
                    res = getPoolState();
                    break;
                default:
                    break;
            }
        } catch (YAPI_Exception e) {
            e.printStackTrace();
            res = e.getLocalizedMessage();
        }
        YAPI.FreeAPI();
        return res;
    }

    private String getPoolState() throws YAPI_Exception {
        if(pool_key.get_state() == YRelay.STATE_B) {
            if (pool_control.get_state() == YRelay.STATE_B) {
                return RESULT_OPEN;
            }else{
                return RESULT_CLOSE;
            }
        }
        return RESULT_RELEASED;
    }

    @Override
    protected void onPostExecute(String result) {
        if(result == RESULT_RELEASED) {
            _statusView.setText(R.string.released);
        }else if(result == RESULT_OPEN) {
            _statusView.setText(R.string.opened);
        }else if(result == RESULT_CLOSE) {
            _statusView.setText(R.string.closed);
        }else{
            _statusView.setText(result);
        }
    }
}



La méthode doInBackground est exécutée dans son propre thread et peut librement accéder au réseau, mais ne peut pas mettre à jour l'interface.

A chaque exécution on initialise l'API (YAPI.RegisterHub()) pour se connecter au YoctoHub-Ethernet et on stop l'API (YAPI.FreeAPI()) à la fin de la méthode. Il faut ensuite initialiser nos deux objets pool_key et pool_control qui vont respectivement activer/désactiver la clef et ouvrir/fermer la protection.

Au lieu d'hardcoder le numéro de série du Yocto-Relay dans le code nous utilisons le nom logique de chaque relais que nous avons configuré avec l'interface web du YoctoHub-Ethernet. L'autre possibilité serait de faire une énumération des relais connectés mais celas rendrait le code inutilement plus long.

Si tout c'est bien passé doInBackground retourne l'état logique du système (ouvert, fermé, libéré), sinon la méthode renvoie le message d'erreur.

la chaîne de caractère retournée par doInBackground est automatiquement passée en argument à la méthode onPostExecute() par Android. Cette méthode est exécutée dans le thread d'interface et peut donc mettre à jour l'interface avec le résultat de doInBackground.

Bien évidement le projet complet est disponible sur GitHub

Et voilà une fois le Yocto-Relay et YoctoHub-Ethernet installé, il ne reste plus qu'a profiter de la piscine tester l'application et retourner au travail.

  

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.