Skyduino:~#
Articles
arduino, Corrigé, programmation, projet

[Arduino] Blyss contrôleur à distance (gateway usb / blyss)

Bonjour tout le monde !

Aujourd’hui je vais vous reparler brièvement de mon projet « Blyss box DIY ».
Ça fait déjà quelques temps que j’avais prévu de faire cet article mais en ce moment c’est de la folie j’ai plus aucun temps libre …

Le principe de ma « Blyss box DIY » est de contrôler les lampes de ma maison depuis une application distante (web, téléphone, … à voir pour le moment ce n’est pas décidé).
Jusque là rien de bien extraordinaire.

Le problème c’est que pour le moment j’ai un code arduino pour spoofer et un autre pour sniffer mais tout deux codé en dure.
Pas pratique donc d’avoir deux arduino, un pour lire et un pour écrire des trames Blyss, surtout que les codes en question demanderaient d’être modifié pour chaque lampe …
Bref, j’ai donc repris les deux codes de base pour en faire un troisième plus « générique » qui se contrôle via des commandes NEMA (comme pour les GPS).

Les commandes ont un format très simple à utiliser (même avec le Serial Monitor) :
Rx : $global_channel;key_MSB.key_LSB;channel;status;rolling_code;timestamp\n
Tx: $global_channel;key_MSB.key_LSB;channel;status\n

Comme pour les « vrai » trames NEMA, chaque commande commence par un dollar ($), puis se compose de différent champs séparé par un point virgule (;) et se termine par un retour chariot (\n)
La trame NEMA en réception est composée de deux champs en plus de celle en émission, le rolling code et le timestamp étant géré en hardware côté émission 😉
Le tout communique par le port série hardware de l’arduino pour pouvoir être branché à un ordinateur via le port usb.

Le code source est disponible sur mon github :
https://github.com/skywodd/arduino_blyss_hack/tree/master/Blyss_arduino_code/blyss_controler

Remarque : Il faut ajouter un #include « pins_arduino.h » en haut du code si vous voulez compiler avec la version 0023 ou antérieur de l’ide arduino.
(j’ai mis a jour le readme du dossier « blyss_arduino_code » du github à ce sujet)

La prochaine étape consistera à télécharger, configurer et compiler une uImage openWRT pour le mini routeur TP-link qui va me servir de serveur.
Pour le moment je sais pas trop quand je vais pouvoir m’y mettre … wait & see, la suite au prochain épisode 😉

Publicités

Discussion

24 réflexions sur “[Arduino] Blyss contrôleur à distance (gateway usb / blyss)

  1. Qu’il est fort ce skywodd !!
    Encore merci 🙂

    Trigger

    Publié par Trigger | 21 octobre 2012, 20 h 45 min
  2. bravo !
    Je suis sur que, comme moi, nous sommes nombreux à suivre tes articles sans forcement répondre.
    Je n’ai pas toucher a l’électronique depuis des années, aprés avoir lut des articles sur Blyss box DIY, j’ai envie de m’y remettre ^^.
    Continue !

    Publié par Luca | 3 décembre 2012, 10 h 02 min
  3. Le serial monitor DOIT être en mode « newline » et sans \n (2 char) à la fin de la commande.

    Essaye ces commandes avec le sniffer en parallèle (et donne moi le résultat) :
    $6;0F.3B;1;p
    $a;0F.3B;1;p

    Publié par skywodd | 26 avril 2013, 10 h 37 min
  4. Sa avance, j’ai des résultats déja quand on a la bonne démarche sa aide, je m’escuse de te faire perdre du temps sur des détails, en revanche mon volet ne bouge pas 😉 le soucis vient du global channel ?

    avec cette commande $6;0F.3B;1;p

    RF frame : FE 00 F3 B8 16 7A 50
    RF footprint : FE – OK
    RF global channel : CH_A
    RF adress : 0F 3B
    RF channel : CH_1
    Light status : OFF
    Rolling code : 67 – OK
    Timestamp : A5

    Frame echo 2
    Frame echo 3
    Frame echo 4
    Frame echo 5
    Frame echo 6
    Frame echo 7
    Frame echo 8
    Frame echo 9
    Frame echo 10
    Frame echo 11
    Frame echo 12

    $a;0F.3B;1;p

    RF frame : FE 00 F3 B8 11 EC 30
    RF footprint : FE – OK
    RF global channel : CH_A
    RF adress : 0F 3B
    RF channel : CH_1
    Light status : OFF
    Rolling code : 1E – OK
    Timestamp : C3

    Frame echo 2
    Frame echo 3
    Frame echo 4
    Frame echo 5
    Frame echo 6
    Frame echo 7
    Frame echo 8
    Frame echo 9
    Frame echo 10
    Frame echo 11
    Frame echo 12
    Frame echo 13

    Publié par Mcolive | 26 avril 2013, 10 h 57 min
    • Dans le fichier RF_Blyss_Spoofer.ino du code gateway, ligne 172 :

      data[1] = (data[1] & 0x0F) | ((channel << 4) & 0xF0);
      

      Il manquait le << 4, je l'avais modifié dans le "vrai" spoofer mais pas dans le code gateway.

      Je publierai le bug-fix sur mon github dés que j'aurai le temps (ce midi ça devrait être bon) 😉

      Publié par skywodd | 26 avril 2013, 11 h 21 min
  5. Sa marche Merci pour votre persévérance, j’ai appris beaucoup de chose grace a vous en peu de temps.

    j’ai plus qu’a faire un serveur web pour le géré a distance 😉

    la classe

    encore Merci

    Publié par Mcolive | 26 avril 2013, 11 h 49 min
  6. salut, je me suis acheté une shield ethernet sur semageek (au passage magasin très sérieux ) et j’ai rajouté une écoute sur celui-ci, j’arrive a faire des requêtes http et à déclencher un ordre.

    Ma question, comment utiliser ton script gateway sans avoir à rentrer manuellement dans le sérial moniteur, j’ai testé plusieurs truc (print.write = trame TX) mais la trame apparaît mais n’ai pas interprété.

    une piste ?

    Merci

    Publié par Mcolive | 2 mai 2013, 19 h 31 min
    • Si tu veut utiliser le code via ethernet ya pas de miracle il faut que tu le modifie pour qu’il utilise la librairie Ethernet …

      Et là … ben faut réfléchir, tu as l’api brute dans les .ino du sniffer et du spoofer, à toi de faire le lien qui va bien avec ta partie http 😉

      Si ton but est de contrôler un seul truc fait les appels à :
      – set_key()
      – set_channel()
      – set_global_channel()
      – set_status()
      Avec les arguments qui vont bien pour avoir ton adresse de télécommande et ensuite:
      – generate_rolling_code()
      – generate_token()
      – send_command()
      Pour déclencher l’envoi d’une trame Blyss.

      Publié par skywodd | 2 mai 2013, 19 h 48 min
      • Oula trop compliquer pour moi, j essayerai plus tard lorsque je toucherai un peu plus

        Merci beaucoup pour ta reponse

        Publié par Mcolive | 2 mai 2013, 23 h 47 min
  7. Bonjour,

    C’est peut être trop demandé, mais bon si je ne tente pas… J’ai un arduino uno avec un émetteur/récepteur 433 Mhz et un kit de prise télécommandée blyss (582886). J’ai essayé de prendre le contrôle des prises avec différents codes que j’ai trouvé ici ou ailleurs, sans succès. Étant novice, ce n’est peut être pas grand chose…
    Quelqu’un aurait il le courage de me dire quel code je devrais utiliser et comment l’adapter à ma config (config pin..).

    Merci

    Publié par romain | 26 janvier 2014, 19 h 26 min
    • Tu prend le code ci dessus, tu fait le montage, tu appuis sur un bouton de ta télécommande et c’est bon.
      Si tu as un exemple de ligne RX tu peut créer des lignes TX sans problème. Il suffit d’enlever les deux derniers champs de la ligne RX pour obtenir une ligne TX.

      Publié par skywodd | 1 février 2014, 15 h 25 min
  8. Ok dis moi si je me trompe, je connecte la sortie de mon récepteur au Pin 0 RX.
    Pour ce qui est du code, tu parle de « RX $global_channel;key_MSB.key_LSB;channel;status;rolling_code;timestamp\n » ou du fichier « RF_Blyss_Sniffer.ino » qu’on peut trouver sur Github ?

    Merci pour ton aide !!!!!!! SInon ce serait impossible vu mes connaissances actuelles…

    Publié par romain | 2 février 2014, 13 h 58 min
    • Tout est précisé dans le fichier blyss_controler.ino :

      /* Transmitter pinmap */
      const byte RF_TX_VCC = 5;
      const byte RF_TX_SIG = 4;
      const byte RF_TX_GND = 3;
      
      /* Receiver pinmap */
      const byte RF_RX_VCC = 11;
      const byte RF_RX_SIG = 12; // don't forget the wire between this pin and D2 !
      const byte RF_RX_GND = 10;
      

      Récepteur -> Arduino :
      VCC -> D5
      SIGNAL -> D4
      GND -> D3

      Émetteur -> Arduino :
      VCC -> D11
      SIGNAL -> D12 ET D2
      GND -> D10

      Pour le reste je fait référence à :
      Rx : $global_channel;key_MSB.key_LSB;channel;status;rolling_code;timestamp\n
      Tx: $global_channel;key_MSB.key_LSB;channel;status\n

      NB : les « Rx » et « Tx » ne sont pas transmit par le code. C’est jute pour différencier ce qu’envoi le code et ce qu’attend le code en retour.

      Publié par skywodd | 2 février 2014, 17 h 09 min
  9. C’est pas gagné, les erreurs suivantes apparaissent à la compilation :

    sketch_feb02a.ino: In function ‘void setup()’:
    sketch_feb02a:63: error: ‘isr_decoding_routine’ was not declared in this scope
    sketch_feb02a.ino: In function ‘void loop()’:
    sketch_feb02a:95: error: ‘get_data’ was not declared in this scope
    sketch_feb02a:98: error: ‘data_analyse’ was not declared in this scope
    sketch_feb02a:125: error: ‘set_key’ was not declared in this scope
    sketch_feb02a:130: error: ‘set_channel’ was not declared in this scope
    sketch_feb02a:155: error: ‘set_global_channel’ was not declared in this scope
    sketch_feb02a:172: error: ‘set_status’ was not declared in this scope
    sketch_feb02a:175: error: ‘generate_rolling_code’ was not declared in this scope
    sketch_feb02a:176: error: ‘generate_token’ was not declared in this scope
    sketch_feb02a:180: error: ‘send_command’ was not declared in this scope
    sketch_feb02a:183: error: ‘send_command’ was not declared in this scope

    Publié par romain | 2 février 2014, 21 h 12 min
    • Il faut télécharger les trois fichiers .ino sinon ça ne compilera pas.

      Publié par skywodd | 9 février 2014, 13 h 13 min
      • J’ai collé le contenu des trois fichiers .ino à la suite et :

        sketch_feb09b.ino: In function ‘byte get_data(byte*)’:
        sketch_feb09b:35: error: ‘data_decoded’ was not declared in this scope
        sketch_feb09b.ino: In function ‘void isr_decoding_routine()’:
        sketch_feb09b:52: error: ‘data_decoded’ was not declared in this scope
        sketch_feb09b:57: error: ‘port’ was not declared in this scope
        sketch_feb09b:57: error: ‘bitmask’ was not declared in this scope
        sketch_feb09b:94: error: ‘data_decoded’ was not declared in this scope
        sketch_feb09b.ino: In function ‘char decToHex(unsigned char)’:
        sketch_feb09b:124: error: ‘c’ was not declared in this scope
        sketch_feb09b.ino: In function ‘void data_analyse(byte*)’:
        sketch_feb09b:141: error: ‘CH_A’ was not declared in this scope
        sketch_feb09b:144: error: ‘CH_B’ was not declared in this scope
        sketch_feb09b:147: error: ‘CH_C’ was not declared in this scope
        sketch_feb09b:150: error: ‘CH_D’ was not declared in this scope
        sketch_feb09b:171: error: ‘CH_1’ was not declared in this scope
        sketch_feb09b:174: error: ‘CH_2’ was not declared in this scope
        sketch_feb09b:177: error: ‘CH_3’ was not declared in this scope
        sketch_feb09b:180: error: ‘CH_4’ was not declared in this scope
        sketch_feb09b:183: error: ‘CH_5’ was not declared in this scope
        sketch_feb09b:186: error: ‘CH_ALL’ was not declared in this scope
        sketch_feb09b.ino: In function ‘void send_header()’:
        sketch_feb09b:248: error: ‘SIG_HIGH’ was not declared in this scope
        sketch_feb09b.ino: In function ‘void send_footer()’:
        sketch_feb09b:256: error: ‘SIG_LOW’ was not declared in this scope
        sketch_feb09b.ino: In function ‘void send_one()’:
        sketch_feb09b:264: error: ‘SIG_LOW’ was not declared in this scope
        sketch_feb09b:266: error: ‘SIG_HIGH’ was not declared in this scope
        sketch_feb09b.ino: In function ‘void send_zero()’:
        sketch_feb09b:274: error: ‘SIG_LOW’ was not declared in this scope
        sketch_feb09b:276: error: ‘SIG_HIGH’ was not declared in this scope

        Grrr, qu’est-ce que j’ai loupé encore ?

        En tout cas, merci beaucoup pour ton aide !

        Publié par romain | 9 février 2014, 13 h 31 min
      • Télécharge les fichiers au lieu de faire des copier coller …
        https://github.com/skywodd/arduino_blyss_hack/archive/master.zip

        Publié par skywodd | 9 février 2014, 17 h 25 min
  10. J’ai ouvert le fichier blyss_controler, j’ai bien 3 onglets, je lance la verif. en croisant les doigts et bim :

    RF_Blyss_Sniffer.ino: In function ‘char decToHex(unsigned char)’:
    RF_Blyss_Sniffer:124: error: ‘c’ was not declared in this scope

    Comment je déteste être dans la position du boulet 😉

    Publié par romain | 9 février 2014, 19 h 26 min
  11. Cool, ça marche ! Ca fait plaisir, même si j’ai galéré pour pas grand chose. Mais quand on débute dans un domaine, c’est un passage dur à éviter…

    Ma joie est quand même assez relative, mon objectif et d’envoyer un signal sans passer par le moniteur, mais en utilisant les commandes que tu as donné dans un post un plus haut. Une fois que j’en serai capable, je pourrais décliner le truc comme je veux.

    Pour commencer, j’ai tenté de modifier la partie contrôleur de ton code.
    Je veux envoyer un signal par l’appui sur un bouton qui vient alimenter le PIN 13.

    Voila la commande moniteur que je veux remplacer :

    $d;53.9C;1;1

    Voici ce qui me paraissait logique (sans être certains de la forme des données à intégrer au RF_BUFFER_TX) :

    /** loop() */
    void loop() {

    switchState=digitalRead(13);
    if (switchState == HIGH){
    set_channel(RF_BUFFER_TX, CH_1);
    set_global_channel(RF_BUFFER_TX, CH_D);
    set_status(RF_BUFFER_TX, ON);

    /* Insert rolling code and token into frame-data buffer */
    generate_rolling_code(RF_BUFFER_TX);
    generate_token(RF_BUFFER_TX);
    if(data_decoded) {
    send_command(RF_BUFFER_TX);
    } else {
    data_decoded = true; // Disable receiver ISR routine (avoid corrupted frame)
    send_command(RF_BUFFER_TX);
    data_decoded = false;
    }
    }

    Donc je me demande :

    Est-ce la bonne façon d’aborder les choses ?
    Y aurait-il un moyen plus simple d’envoyer l’équivalent de la commande moniteur ?
    Suis-je vraiment à coté de la plaque ?

    Publié par romain | 9 février 2014, 22 h 17 min
  12. Salut Skywood
    Tout d’abord un grand bravo pour ton travail … et merci de le partager ainsi !!

    J’ai suivi avec attention ton blog et j’ai réussi à faire fonctionner le RF_Blyss_Spoofer.ino et le RF_Blyss_Sniffer.ino pas de soucis.
    Par contre sur le avec le code blyss_controler.ino, j’ai la partie sniffer qui fonctionne mais pas moyen de faire allumer une lampe ?

    J’envoi un code de ce type $7;12.47;1;p dans le monitoring Arduino mais rien ?!

    Peux-tu m’aider ?

    Merci d’avance

    Publié par zeppy14 | 5 septembre 2014, 21 h 33 min
    • C’est quoi le résultat du sniffer et la ligne exact que tu utilises pour le spoofer ?

      Publié par Skywodd | 6 septembre 2014, 12 h 36 min
      • Salut,
        Lorsque j’actionne la télécommande j’ai ce résultat dans RF_Blyss_Spoofer.ino est
        RF frame : FE 71 24 78 09 87 90
        RF footprint : FE – OK
        RF global channel : 7
        RF adress : 12 47
        RF channel : CH_1 (8)
        Light status : ON
        Rolling code : 98 – OK
        Timestamp : 79

        J’ai donc modifie RF_Blyss_Sniffer.ino
        /** Key ID to spoof */
        byte RF_KEY[] = {
        0x71, 0x24, 0x78
        };
        Et la ça fonctionne nickel !!

        L’appui sur la télécommande sous blyss_controler.ino donne ceci
        $7;12.47;1;P;V;55
        $7;12.47;1;p;V;D1
        $7;12.47;1;P;V;D8

        Mais lorsque dans le moniteur serie Arduino j’envoi ceci
        $7;12.47;1;p
        j’ai rien qui se passe.

        @ +

        Publié par zeppy14 | 6 septembre 2014, 21 h 02 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.