Go Down

Topic: Ravelli Gateway : Domotiser son Poelle à Pellet Ravelli (Palmaire touch radio) (Read 2381 times) previous topic - next topic

antoninocanta

Bonjour à tous,

Je viens ici partager mon expérience sur un projet qui a aboutis : j'ai récemment domotisé mon poelle à pellet ravelli via un module radio (868) contrôlé par un arduino ^^  (que j'ai nommé la "ravelli gateway" pour être super original).

Ce projet m'a pris pas mal de mon temps, c'est donc avec plaisir que je partage ceci pour les amateurs de domotique ^^  Et puis cela pourrais éventuellement amenée des gens à se pencher sur les aspects du projet que je n'ai pas compris (je ne suis qu'un amateur chipotteur...  niveau low+).

Donc voila pour l'histoire, dans un premier temps, la solution que j'envisageai était via un relai piloté par un arduino, connecté directement à la carte mère (il y a dans la doc du poel une petite section pour la mise en place d'un "système domotique avancé" ...  qu'ils disent dans la doc...  :smiley-roll:   ).

Puis un jour, pouf la télécommande vole à terre, remplacement, blabla avec l'installateur.... et puis hop, j'ouvre et j'ausculte la télécommande  :smiley-grin: et je vois que le module radio est un truc tout fait :D  (ralala qué des feignass).  

RTX-868-FSK

Googeler cela et vous trouvez facilement la doc sur internet, et sur ebay nous trouvons ce module pour 20-25 €.
Le principe est simple, on peut mettre le module soit en mode "écoute" soit en mode "émission", et puis envoyé des 0 et des 1 via le 868, la modulation - démodulation est gérée par le module, tout ce qu'on a à faire c'est blablater avec ^^

Donc première phase : mettre le module en mode écoute, et écouter tout ce qui se passe.  Là ça prend assez de temps à analyser (pour info je me suis servis d'un "logic analyser" de type salae) donc je vous passe les détails.  Alors, le poel et la télécommande parle en "asynchronous serial Inverted" avec un bitrate de 4800b/s.

Dans les images jointes, vous pourrez observer des exemples de trames que s'envoie la télécommande et le poel.

Malheureusement, je n'ai pas réussis a déchiffrer tout ce qui se trame par là...  (ahah)...   Et j'ai l'impression que certaines valeurs sont "arbitraire"...
Tout d'abord, il y a le burst : émissions de plusieurs 1-0-1-0...  puis série de 0 d'au moins 40ms.
Ensuite, ça commence la causette.
Voici ce que j'ai pu déchiffrer :
(en hexa)
premier byte :  si c'est la télécommande qui cause, c'est 0xBC.  le Poele : 0xCB   -> est ce que cela change en fonction du poele ?
deuxieme byte : le nombre de byte qui est à venir !
3eme : télécommande : 0x21.  Poele : 0x11 -> est ce que cela change en fonction du poele ?
4ème : tout le temps 0xCC -> valeur integer 204, ressemble étrangement au "champ ID", que l'on peu lire sur la télécommande lorsque le poel est coupé complètement (prise débranchée).

Les byte qui suive, c'est en fonction du type de requête, en générale, 2 ou 3 byte de requête (la télécommande répond avec ces 2-3 même byte pour valider que la réponse est bien en fonction de la question)...

Enfin, il y a les 2 dernier byte qui sont (certainement) un contrôle de redondance (CRC16 ou autre)  mais impossible de reproduire ceci ou de le recalculer ! j'ai tourner la formule dans tout les sens, sur une feuille blanche, je me suis cassé la tête, mais impossible de mettre la main sur la bonne formule...  Tant pis, je me passe du checksum ^^


J'ai pus voir passé une dizaine de requête différente, je n'ai identifier que 2-3, dont celles qui m'intéressent : le questionnement pour l'état du poelle, et la commande allumé ou éteindre (c'est la même!).

voici quelques requête :

byte hello1[] = {0xBC, 0x07, 0x21, 0xCC, 0x01, 0x00, 0x1E, 0x9A, 0xBC };
byte hello2[] = {0xBC, 0x07, 0x21, 0xCC, 0x01, 0x00, 0x63, 0x35, 0x86 };
byte hello3[] = {0xBC, 0x07, 0x21, 0xCC, 0x01, 0x00, 0x53, 0x03, 0xD5 };
byte hello4[] = {0xBC, 0x07, 0x21, 0xCC, 0x01, 0x00, 0x52, 0x13, 0xF4 };
byte hello5[] = {0xBC, 0x07, 0x21, 0xCC, 0x01, 0x00, 0x12, 0x13, 0xF4 };
byte hello6[] = {0xBC, 0x07, 0x21, 0xCC, 0x10, 0x17, 0x01, 0x97, 0xD5 };
byte hello7[] = {0xBC, 0x07, 0x21, 0xCC, 0x10, 0x07, 0x04, 0xC4, 0x03 }; -> demande de l'état du poel.  Réponse sur 4 byte !
byte hello8[] = {0xBC, 0x07, 0x21, 0xCC, 0x10, 0x07, 0x01, 0x94, 0xA6 }; -> demande de l'état du poel.  Réponse sur 1 byte -> c'est cette requête que je fais tout le temps !
byte hello9[] = {0xBC, 0x07, 0x21, 0xCC, 0x10, 0x0A, 0x01, 0xE2, 0xFA };

//update de température
byte helloTemp1[] = {0xBC, 0x08, 0x21, 0xCC, 0x11, 0x00, 0x01, 0x17, 0xF4, 0xCF }; //8eme byte pour la temp en ascii : 23 degré
byte helloTemp2[] = {0xBC, 0x08, 0x21, 0xCC, 0x11, 0x00, 0x01, 0x18, 0x05, 0x20 };
byte helloTemp3[] = {0xBC, 0x08, 0x21, 0xCC, 0x11, 0x00, 0x01, 0x19, 0x15, 0x01 };

//la grosse commande : allumé ou éteindre
byte grossecmd[] = {0xBC, 0x06, 0x21, 0xCC, 0x07, 0x01, 0x9B, 0xDA };


Les réponses du poêl à la requête hello8 :
byte reppoel08_on1[] = {0xCB, 0x08, 0x11, 0xCC, 0x10, 0x07, 0x01, 0x03, 0x7A, 0xD2 }; //en cours de démarrage

le 0x03 se transforme en :

   if (theresponse[7] == 0x00)  {setPoelStatus(1,"Completement%20Arrete"); codePoel=false;}
   else if (theresponse[7] == 0x01)  {setPoelStatus(1,"OK%20Cleaning"); codePoel=true;}
   else if (theresponse[7] == 0x03)  {setPoelStatus(1,"OK%20En%20cours%20de%20demarrage"); codePoel=true;}
   else if (theresponse[7] == 0x05)  {setPoelStatus(1,"OK%20Completement%20Demarre"); codePoel=true;}
   else if (theresponse[7] == 0x08)  {setPoelStatus(1,"En%20cours%20d%20arret"); codePoel=false;}
   else if (theresponse[7] == 0x11)  {setPoelStatus(1,"Modula"); codePoel=true;}
   else if (theresponse[7] == 0x17)  {setPoelStatus(2,"Alarme%2005"); codePoel=false;}
   else if (theresponse[7] == 0x18)  {setPoelStatus(2,"Alarme%2006"); codePoel=false;}
   else if (theresponse[7] == 0x19)  {setPoelStatus(2,"Alarme%2007"); codePoel=false;}
   else { setPoelStatus(4,"Unknown%20Status%20code%20-%20"); codePoel=false;}

Vous l'aurez compris : je code comme un zanglief ....

Donc voila, je pense qu'il est possible de faire beaucoup de chose via ce module (certainement tout ce que l'on peut faire avec la télécommande de base) mais bon, c'est trop pour moi :D

J'ai lier le code pour un arduino avec shield ethernet et shield perso sur carte de prototypage...  Et j'ai même lié un modèle 3D pour une box arduino "ravelli gateway"  ;)

Voila voila, si vous avez des question n'hésitez pas ;)

ciao.

antoninocanta

Je rajoute quelques lignes pour le câblage (pour les personnes qui veulent aller jusqu'au bout ^^)

Au début, je faisais mes tests avec un arduino mini directement en 3.3v, ça passe sans aucun soucis (avec les entrée sortie reliées directement au module 868).

Ensuite lorsqu'il fut temps de mettre ça en prod (enfin sur mon meuble TV quoi xD ...) , j'ai eu un soucis avec la conversion 5v vers 3.3v ....  avec un logical level shifter (tel que celui-ci : https://www.sparkfun.com/products/12009) cela ne fonctionne pas....  après réflexion et discutions avec des collègues électronicien, il s'agit surement de l'impédance du level shifter qui serait trop élevé pour le transceiver.

Comme workaround, je travail avec des ponts diviseurs de tension pour les signaux qui vont de l'arduino vers le transceiver (et rien dans le sens transceiver -> arduino).

Ciao ;)

kammo

Rah ouais, ya des gens qui réfléchissent!
Super, j'en veux un ^^
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

antoninocanta

Hello,
de nouveau quelques lignes xD
bon après réflexion, il aurait été difficile pour les personnes délirantes de reproduire cette gateway de le faire sans passer par une analyse des communications du poel et de la télécommande...  Car en fonction de leurs champ ID, les 2 derniers bytes de CRC changent...
Donc j'ai de nouveau tenter une compréhension et Bingo ! ^^  j'ai eu plus de chance ici...

sur ce site,
https://www.lammertbies.nl/comm/info/crc-calculation.html

lorsque j'introduis à partir du 3ème byte jusqu'au dernier utile (sans les 2 de CRC évidemment), je retrouve mon CRC -> CRC-CCITT (XModem)

Donc en principe, si vous introduisez votre champ ID (vous allumez la télécommande avec le poele complètement débrancher) à la place du 4ème byte (chez moi, 0xCC, en décimal 204), vous recalculer le CRC grâce au site, et vous créez vos propres requêtes ;)
En réalité dans mon code, je n'utilise que hello8 et grossecmd...............  j suis gêné rien qu'a les citer  :smiley-kiss:

Ciao

reve51

Hi Antonino,
sorry but I can't speak French. I really appreciate your post about the automation of the stove.
I have this model of stove and I would like to accomplish the remotization of the power on/off of the stove.
I dont't have experience on arduino and co. Is it impossible or could you help me to do your good job?

Thank You
Regards
Ciao

Emerinu

Bonjour Antoninocanta

D'abord merci pour toutes ces informations. Elles me guident dans mes propres recherches.
J'ai installé récemment un poêle Ravelli modèle infinity. Déçu par la programmation offerte par la télécommande d'une part, et ayant une certaines connaissances en micro-informatique d'autre part, je cherche une substitution à cette télécommande.
La télécommande peut se brancher directement par un câble à l 'arrière du poêle ou communiquer par liaison radio.
J'ai commencé par analyser les signaux échangés avec la connexion filaire. Une petite adaptation électronique m'a permis d'envoyer les messages échangés sur l'entrée RS252 d'un PC. Cela m'a permit de cataloguer les messages utilisés par toutes les manipulations que permet la télécommande. Bien évidemment, ceux que vous décrivez précédemment y figurent.
Je veux maintenant utiliser la liaison radio. D'abord le transceiver de la télécommande à changé. C'est le circuit :  SX1211: Wireless RF 868 Mhz - 3,3v - 25mA qui est utilisé. Côté poêle, je n'ai pas encore démonté le poêle pour accéder à la carte électronique, mais d'après les dernières documentations accessibles sur le site de Ravelli, ce serai encore le tranceiver  RTX-868-FSK qui serai utilisé.
C'est là que commencent mes déboires. Le circuit RTX-868-FSK que j'ai acheté et câblé reçois des caractères en permanences. Aucune structure logique dans les messages. J'ai l'impression que c'est du bruit transformé en code ascii. Je n'ai pas trouvé de source radio polluante dans les alentours.
- Avez-vous pris des précautions particulières pour câbler ce circuit?
- Quel canal (868,3MHz ou 869,85MHz sélectionné par la broche 6 CN/SEL) avez-vous utilisé?
Avant d'admettre que mon circuit est défectueux, j'aimerai avoir balayé toutes les autres possibilités d'anomalies.
Merci par avance et bienvenue à toutes vos idées et réponses,

antoninocanta

Bonjour,
Alors, si mes souvenirs sont bon, la fréquence est 868,3 mhz.
Ensuite, Oui en effet, la puce capte bel et bien tout les bruit environnent, si bien que les réponses en sorties sont totalement anarchique jusqu'au moment ou une vrai communication commence.  Dés lors qu'il capte un vrai signal, les bruit s'estompent et laisse place à la vrai communication.
Je joins une capture directement en sortie de la puce ou j'écoute la communication entre le poel et la télécommande.  (la première capture était en sortie de l'arduino et c'était moi qui l'émettait, voici pourquoi la capture était si clair ^^  désolé, je vous ai induit en erreur)

C'est pourquoi dans mon code code, Je ne fais qu'écouté après l'émission de ma requête, et j'attend la réception du premier byte correct :

while(millis() < timeout)
{
 
  theresponse[0]=mySerial.read();
 
  if (theresponse[0] == (byte)0xCB)
...

Voilavoila, je reviendrais voir plus souvent le post, désoler de la lenteur de ma réponse :s

Emerinu

Merci Antoninocanta d'avoir pris le temps de me répondre.
J'ai essayé un second transmiter qui donne le même résultat.
J'avais comme vous le dites pensé qu'une vrai communication pouvait se cacher dans le bruit reçu. Malheureusement les différentes analyses que j'ai réalisées ne m'ont pas permis de les trouver.
J'ai édité votre fichier joint. Je suis étonné de ne pas retrouver des chaines de message comme:
0xBC, 0x07, 0x21, 0xCC, 0x10, 0x07, 0x01 ... par exemple.
Avec Notepad++ et un affichage en hexa j'ai ceci:
00 00 00 00 00 00 21 1c 00 00 00 00 00 00 01 00
00 00 00 00 00 00 2f ec 00 00 00 00 00 00 2c 1c
00 00 00 00 00 00 2b 1c 00 00 00 00 00 00 01 00
00 00 00 00 00 00 73 ec 00 00 00 00 00 00 36 1c
Pourquoi tout ces 00 ?
En attendant, mon adaptation du câble de la télécommande vers une RS232 fonctionne bien.
Depuis un PC et une application écrite en WinDev je gère mon poêle.
Je dois maintenant transposer tout cela vers un Raspberry Pi J'hésite encore entre Python ou le C pour écrire le programme.
Je referais des essais avec le transmiter en devenant maître de la communication et non plus en restant seulement à l'écoute.
Si vous pouviez m'éclairer sur le contenu de votre fichier ce serai super.
Cordialement

antoninocanta

Hello,
Alors, ce que tu essaye d'analyser en hexa est une capture avec un logic data analyser (type salae : https://www.saleae.com/downloads/).  L'appareil utilise une fréquence d'échantillonnage que l'on détermine et que l'on place plus haut que la vitesse de transmission réelle (pour ne pas rater d'info).
Du coup, avec le logiciel, c'est très clair (voir image) mais en hexa, pas trop à mon avis :s

Bonne continuation ;)

Emerinu

Arf! j'étais à côté de la plaque. Maintenant j'ai compris.
Ma première méthode d'analyse était similaire, mais ne disposant pas d'analyser j'ai connecté le signal filaire de la télécommande à travers une petite interface électronique sur l'entrée ligne de mon PC.
J'ai enregistré dans un fichier wav puis écrit un programme pour transformer les échantillons du fichier wav en code ascii.
Je vais retourner à mes essais, ça va me prendre quelques jours. Je reviendrai vous informer des résultats
Merci et à plus.

Fred1024

Bonjour à tous,

Pour ma part j'ai un Ravelli Dual 9 et je m'intéresse depuis quelques jours à le connecter à ma future domotique (bah oui, je n'ai pas encore fait grand chose, lol). Je suis en plus débutant en Arduino (je sais, c'est pas gagné). Je voudrais au choix soit une solution radio, wifi ou rs232.

Tout d'abord, merci Antoninocanta pour toutes ces informations précieuses.

Une photo de ton prototype câblé aurait été le bienvenu pour m'aider, car j'ai un peu de mal à comprendre comment câbler le module FSK a l'arduino (en lisant la doc, un peu trop succinte à mon gout, gnd vcc ok mais bon pour le reste gloups...)

En regardant ton code, j'ai vu l'utilisation des pin de 2 à 6 (define).
Voici mes suppositions :
- SDSD (désolé je vois pas :'( )
- rxPin (à câbler sur la pin DIGITAL DATA OUTPUT, je présume)
- txPin (à câbler sur la pin DIGITAL DATA INPUT, je présume)
- enablePin (à câbler sur la pin ENABLE)
- ioChoicePin (à câbler sur la pin  TX/RX)
- les pin RSSI,  CN/SEL du module FSK ne sont pas reliées

Bon, à présent j'attends les insultes et les tomates ;)

Merci d'avance.

Emerinu

Bonjours.
J'ai lamentablement échoué dans l'utilisation du module radio. Je n'ai pas réussi à capter de signaux.
J'ai donc finalisé ma connexion filaire pour continuer mon projet.
J'ai attaché à ce post un fichier "Liaison RS232.odg" (LibreOffice Draw) qui contient le schéma des 2 extrémités de la liaison RS232.
Je suis en train de développer un programme en langage C pour le Raspberry. J'ai plein d'idées mais peu de temps devant moi car la saison de chauffe devrai s'arrêter dans un mois.
Depuis hier je mesure la température intérieure et la transmet au poêle qui n'y voit que du feu^^
A suivre...

Emerinu

Petite précision complémentaire:
Le câble Ravelli qui se branche entre le poêle et la télécommande possède 4 fils de couleur:

violet    masse (0v)
rouge    transmission série asynchrone bi-directionnelle
orange  +18v (attention aux court-circuits: danger! Je ne sais pas à quoi il sert)
blanc    +5v

Je dispose aussi d'un dictionnaire définissant les principaux messages échangés
A plus

antoninocanta

Hello Fred1024,
Bonne déduction pour la connexion des pins ;)
attention que le module est en 3.3v et l'arduino en 5v donc pour la communication entre arduino -> module, il faut passer par un pont diviseur de tension.  
Je ferais un petit montage dessin fritz prochainement ;)  mais en principe tu a tout bon sur la connectique.

la pin SDSD c'est le module SD du shield ethernet chinois, je ne l'utilise pas dans ce montage.  par ailleur, je te déconseille le shield ethernet chinois car j'ai des soucis avec au démarrage, il faut le rebooter a chaque mise sous tension car il ne prend pas d'IP :s  c'est chiant lors de panne de courant car c'est le genre de truc que l'on oublie xD

Emerinu, tant mieux si tu a trouver ton bonheur avec le RS232, je vais analyser ton code pour voir si les commandes du poel sont les mêmes, il y a des chances ^^
bien à vous
antonino

Emerinu

Ci-joint la liste des commandes en RS232. En radio l'entête est différente je suppose.

Go Up