Domotiser PAC inverter de piscine IrriJardin/WarmPool : aide connection RS485

Merci pour ta reponse @chris99977
C’est effectivement ce que j’ai essaye de faire dans le post ou je fais reference.
J’ai mis ces trames dans un Excel mais je n’en comprends pas le sens ni comment les dechiffrer.
Phnixsmart doit bien avoir une reference de decodage qq part non? Ou y’a-t-il un autre moyen de decoder cela?

Pour l’instant j’ai sniffe toutes les trames qui sont utiles pour allumer ou eteindre la PAC avec les temperatures dont j’ai besoin et cela fonctionne et je balance cette trame avec leur webservice avec une commande de type ‹ SendData › …
Par contre pour lire les valeurs il y a une fonctione de type ‹ GetData › qui retourne egalement une trame et sans pouvoir la decoder impossible d’en extraire les informations. Dommage …

Sebastien

1 « J'aime »

Hello,

Pourrais tu être plus précis sur les parties à analyser et modifier ?
De mon côté je pense avoir les mêmes adresses que @jeje32.

Par exemple le code choppe bien le message de modif target au clavier mais pas depuis le module wifi que j’ai laissé branché en parallèle pour vérifier ce qu’il se passait.
Au final aucun ordre ne passe.

Chris

Bonjour à tous, merci pour le travail très intéressant que vous avez fait !

J’apporte une petite pierre à l’édifice, voici un petit tutoriel pour les débutants avec Arduino, pour expliquer comment téléverser le travail de freddye83 dans un Wemos D1 mini.

  1. Téléchargez et installer l’IDE Arduino, disponible sur https://www.arduino.cc/en/software
  2. Ensuite, nous allons ajouter la compatibilité aux cartes avec un ESP8266 (Wemos, …) à l’IDE Arduino, pour cela ouvrez Arduino puis cliquez sur « Fichier », puis « Préférences ».
  3. Dans le champ « URL de gestionnaire de cartes supplémentaires », saisissez « http://arduino.esp8266.com/stable/package_esp8266com_index.json » puis cliquez sur « OK ».
  4. Nous allons maintenant installer le type de carte ESP8266, pour cela cliquez sur « Outils » puis « Type de carte[…] » et enfin « Gestionnaire de carte ».
  5. Dans la liste, recherchez et installer « esp8266 », mais attention, vous devez sélectionner la version 2.7.4 car les versions plus récentes posent des problèmes de compilation avec la librairie « RemoteDebug ».
    Une fois fait, vous pouvez fermer le Gestionnaire de carte.
  6. Nous allons maintenant installer les librairies nécessaire au programme de freddye83, pour cela cliquez sur « Outils », puis « Gérer les bibliothèques ».
  7. Dans la liste recherchez « RemoteDebug » et installez.
    Faire de même avec « CRCx », « PubSubClient », et « RingBuffer ».
  8. L’IDE est maintenant prêt, téléchargez le programme de freddye83 sur https://github.com/freddye83/esp8266_warmpool, en cliquant sur « Code » puis « Download ZIP ».
  9. Décompressez le fichier téléchargé, puis renommez le dossier contenant les fichiers en « esp8266_warmpool ».
  10. Vous pouvez maintenant ouvrir le programme en ouvrant « esp8266_warmpool[.ino] ».
  11. Pour le premier téléversement vers le Wemos, vous devez le connecter en USB à votre ordinateur.
  12. Nous allons maintenant indiquer à l’IDE quel est le type de carte que l’on souhaite utiliser, pour cela cliquez sur « Outils » puis « Type de carte[…] » et choisissez votre type de carte dans « ESP8266 Bords (2.7.4) », pour mon cas il s’agissait de « LOLIN(WEMOS) D1 mini Pro ».
  13. Nous allons maintenant indiquer à l’IDE comment communiquer avec notre carte, pour cela cliquez à nouveau sur « Outils » puis dans « Port » choisissez le port « COM[x] » détecté.
    Si « Port » est grisé c’est peut-être que vous devez installer le driver adapté à votre carte.
  14. Nous allons maintenant remplir les quelques champs de configuration du programme, cela se passe dans l’onglet « config.h » de l’IDE, remplissez les champs suivants :

#define WIFI_SSID « xxxx » // Le nom de votre WiFi
#define WIFI_PASSWORD « xxxx » // La clé de votre WiFi
#define BROKER « 192.168.xxx.xxx » // Adresse IP locale de votre Jeedom

  1. Nous pouvons maintenant téléverser le programme, pour cela cliquez sur « Croquis » puis sur « Téléverser ».
    Une fois terminé, appuyez sur le bouton reset de votre carte.
    Celle-ci devrait apparaître sur votre réseau.
  2. Pour les prochains téléversements, cela peut se faire à distance, pour cela vous pouvez maintenant choisir dans « Outils » puis « Port » l’adresse IP de votre carte (Celle-ci n’apparaît peut-être pas tout de suite le temps qu’elle se connecte à votre réseau).
  3. Pour que les informations remontent à votre Jeedom, si vous utilisez le plugin jMQTT, passez en mode inclusion: Un nouvel équipement nommé « WARMPOOL » devrait apparaît rapidement.

Et voilà, tout est prêt.

1 « J'aime »

Bonjour, est ce que vous avez déjà testé avec la version Poolex jetline 90, on dirait presque la même télécommande ? ce sont les mêmes trames ?

Bonjour,

Non, pour ma part je teste avec une Hayward ECPI30MA, globalement cela fonctionne mais les commandes ne sont pas fonctionnelles (rien ne se passe), d’ailleurs si quelqu’un a la même pompe à chaleur et a trouvé la solution je suis preneur …

J’ai trouvé des informations intéressantes, en me baladant dans le menu « Parameter » de la pompe à chaleur (Avec le code 22), j’ai pu trouver les correspondances suivantes :

Unit state/Temp Status:

T01: Suction Temp (°C, x/10)
T02: Inlet water Temp (°C, x/10)
T03: Outlet water Temp (°C, x/10)
T04: Coil 1 Temp (°C, x/10)
T05: Ambient Temp (°C, x/10)
T06: Exhaust Temp (°C, x/10)
T07: Compressor current Detect (A, x/10)
T08: AC Fan Output (%, x)
T09: Flow Rate Input (?)
T10: Pressure Sensor (?)
T11: Super heat (°C, x/10)
T12: Target speed of fan motor (r, x)
T13: Over heat after commpen (°C, x/10)
T14: Inverter plate AC voltage (V, x)
T15: Antifreeze Temp (°C, x/10)
T16: EC fan motor speed (?)
T17: Speed of fan motor1 (r, x)
T18: Speed of fan motor2 (?)
T19: Buses voltage (V, x)
T20: Limited Frequency Protect State (YES/NO)
T21: Frequency Reduction Protect State (YES/NO)
T22: Coil 2 Temp (°C, ?)
T23: driver board running state 1 (x)
T24: driver board running state 2 (x)
T25: driver board running state 3 (x)
T26: driver board running state 4 (x)
T27: driver board running state 5 (x)

Unit state/Switch Status:

S01: HP switch (OPEN/CLOSE)
S02: LP switch (OPEN/CLOSE)
S03: Flow switch (OPEN/CLOSE)
S04: Remote switch (OPEN/CLOSE)
S05: Mode switch (OPEN/CLOSE)
S06: Master/Slave switch (OPEN/CLOSE)

Unit state/Load Status:

O01: Compressor (ON/OFF)
O02: Circulate pump (ON/OFF)
O03: 4-way valve (ON/OFF)
O04: High fan (ON/OFF)
O05: Low fan (ON/OFF)
O06: Exp. valve (N, x)
O07: Comp. output frequency (Hz, x)
O08: Compressor current (A, x/10)
O09: IPM Temp (°C, x/10)

Parameters:

D01: Stat Defrosting Temp (°C, x/10)
D01: Start setp (bar, x/10, le doublon n'est pas une faute de frappe, c'est comme ça dans les menus)
D02: End Defrosting Temp (°C, x/10)
D03: Defrosting Cycle (Min, x)
P01: Mode (Nor/Interval/Stop, Le jeu de paramètres Pxx permet de définir une mise en marche cycle de la commande pompe eau afin de prendre la température de l'eau lorsque la pompe a chaleur est à l'arrêt, et savoir si il faut donc démarrer la pompe a chaleur)
P02: Interval (Min, x)
P03: Duration (Min, x)
P04: Advance (Min, x)
H03: Temperature unit (°C/°F)
1 « J'aime »

Je remonte correctement toute les informations S0x, et O0x, j’y suis presque en ce qui concerne les Txx.

En début de code et à côté de :

#define XtoInt(x,y) (int16_t)word(msg[x], msg[y])

J’ai ajouté ceci :

#define XtoBit(x,y,b) bool(((int16_t)word(msg[x], msg[y])) & (1 << b))
#define XtoFloat(x,y) float((int16_t)word(msg[x], msg[y])) / 10

Dans la condition suivante :

else if (msg_dump.startsWith("00 10 07 D1")) { // températures

Je récupère les S0x de cette manière :

PUB("WARMPOOL/S01", String(XtoBit(73, 74, 0)).c_str());
PUB("WARMPOOL/S02", String(XtoBit(73, 74, 1)).c_str());
PUB("WARMPOOL/S03", String(XtoBit(73, 74, 2)).c_str());
PUB("WARMPOOL/S04", String(XtoBit(73, 74, 3)).c_str());
PUB("WARMPOOL/S05", String(XtoBit(73, 74, 4)).c_str());
PUB("WARMPOOL/S06", String(XtoBit(73, 74, 5)).c_str());

Et les O0x comme ceci :

PUB("WARMPOOL/O01", String(XtoBit(43, 44, 0)).c_str());
PUB("WARMPOOL/O02", String(XtoBit(43, 44, 1)).c_str());
PUB("WARMPOOL/O03", String(XtoBit(43, 44, 2)).c_str());
PUB("WARMPOOL/O04", String(XtoBit(43, 44, 3)).c_str());
PUB("WARMPOOL/O05", String(XtoBit(43, 44, 4)).c_str());
PUB("WARMPOOL/O06", String(XtoInt(45, 46)).c_str());
PUB("WARMPOOL/O07", String(XtoInt(47, 48)).c_str());
PUB("WARMPOOL/O08", String(XtoFloat(49, 50)).c_str());
PUB("WARMPOOL/O09", String(XtoFloat(51, 52)).c_str());
1 « J'aime »

Concernant les Txx, voici où j’en suis :

PUB("WARMPOOL/T01", String(XtoFloat(95, 96)).c_str()); //ok
PUB("WARMPOOL/T02", String(XtoFloat(97, 98)).c_str()); //ok
PUB("WARMPOOL/T03", String(XtoFloat(99, 100)).c_str()); //ok
PUB("WARMPOOL/T04", String(XtoFloat(101, 102)).c_str()); //ok
PUB("WARMPOOL/T05", String(XtoFloat(103, 104)).c_str()); //ok
PUB("WARMPOOL/T06", String(XtoFloat(105, 106)).c_str()); //ok
PUB("WARMPOOL/T07", String(XtoFloat(107, 108)).c_str()); //ok
PUB("WARMPOOL/T08", String(XtoInt(109, 110)).c_str()); //a voir, incertain
PUB("WARMPOOL/T09", String(XtoInt(111, 112)).c_str()); //a voir, incertain
PUB("WARMPOOL/T10", String(XtoInt(113, 114)).c_str()); //a voir, incertain

PUB("WARMPOOL/T11", String(XtoFloat(125, 126)).c_str()); //ok (mais a voir lorsque dans les negatifs)
PUB("WARMPOOL/T12", String(XtoInt(127, 128)).c_str()); //ok
PUB("WARMPOOL/T13", String(XtoFloat(129, 130)).c_str()); //ok
PUB("WARMPOOL/T14", String(XtoInt(131, 132)).c_str()); //ok
PUB("WARMPOOL/T15", String(XtoFloat(133, 134)).c_str()); //a voir, incertain
PUB("WARMPOOL/T16", String(XtoInt(135, 136)).c_str()); //a voir, incertain

PUB("WARMPOOL/T17", String(XtoInt(139, 140)).c_str()); //ok
PUB("WARMPOOL/T18", String(XtoInt(141, 142)).c_str()); //a voir
PUB("WARMPOOL/T19", String(XtoInt(143, 144)).c_str()); //ok
PUB("WARMPOOL/T20", String(XtoInt(145, 146)).c_str()); //a voir, incertain
PUB("WARMPOOL/T21", String(XtoInt(147, 148)).c_str()); //a voir, incertain
PUB("WARMPOOL/T22", String(XtoInt(149, 150)).c_str()); //a voir, incertain

PUB("WARMPOOL/T23", String(XtoInt(161, 162)).c_str()); //a voir
PUB("WARMPOOL/T24", String(XtoInt(163, 164)).c_str()); //a voir
PUB("WARMPOOL/T25", String(XtoInt(165, 166)).c_str()); //a voir
PUB("WARMPOOL/T26", String(XtoInt(167, 168)).c_str()); //ok
PUB("WARMPOOL/T27", String(XtoInt(169, 170)).c_str()); //a voir

cool ca bosse dure !
j’ai la même pompe que toi et effectivement j’ai réussi a faire aucune commande de mon coté… et pas trop le temps de déboguer le sujet ^^

si tu arrives a qqchose je serais grave preneur :slight_smile:

bon courage

En effet, merci :slight_smile:

Joie, ça y es je suis parvenu à piloter la marche/arrêt de la pompe a chaleur, pas encore la consigne mais cela ne saurait tarder.

J’ai beaucoup modifié le code, afin que l’ESP se comporte au plus près comme la passerelle WiFi d’origine.
De cette manière, c’est plus générique et devrait pouvoir fonctionner sans modifications sur d’autres pompes à chaleur utilisant la même carte de contrôle, à tester.

Il y a encore du travail avant diffusion, mais ça devient bon.

1 « J'aime »

@andrec @titi2097

J’ai pas mal bougé le code de l’ESP aussi de mon côté mais pour coller au comportement de l’afficheur en esclave 01. En fait j’ai pu trouver que le module en esclave 02 ne répondait pas toujours au demandes du maître en 02 10 et on constate une répétition de messages alors que l’afficheur en 01 paraît plus clean dans ses échanges et les acquittes tous proprement.

En réponse au message d’attente d’ordre du contrôleur il y a donc une trame de longueur 65 dans laquelle on rentre 10 ou 04 pour demander un dialogue le contrôleur, il confirme son attente d’instruction par un message 8 et là ensuite on lui passe un message long de 185 avec les paramètres. Le contrôleur acquitte avec un msg 31 de long qu’il faut aussi acquitter.

Les Modes passent avec une demande en codage 04 sur la trame de 65 mais petite subtilité pour la consigne il faut la lancer en instruction 10 et reboucler ensuite un cycle en 04.

Pour complexifier un peu, les messages 185 en réponse suite à une instruction 10 ou 04 n’ont pas les mêmes positions.

J’arrive maintenant à passer la consigne, le ON OFF et les modes (Auto/Cold/Heat).
Seul bémol quand on passe une consigne si la pac était à Off elle bascule en On.

J’ai vu aussi les bornes min et max se balader dans les trames suivant le mode, en revanche pour les timer, je ne comprends pas les encodages des horaires, mais la saison de baignade étant entamée ça me parait pas indispensable.

Je poursuit sur le silent mode si pas trop hard avant de vous pousser le code (j’espère avant le WE) afin d’en faire profiter ceux qui ont des hayward et autres Majestic en Inverter.

Christophe

1 « J'aime »

@chris99977

En effet j’ai ces mêmes trames supplémentaires vers l’adresse 2, j’y répond de cette manière pour éviter ces répétitions de messages (Réponse à une écriture Modbus, code fonction 0x10):

uint8_t RPLY[6];

for (uint8_t i = 0; i < 6; i++) {
  RPLY[i] = msg[i];
}

sendmsg(RPLY, sizeof(RPLY));

C’est très intéressant tout ça, la trame de 65 dont tu parles c’est bien celle que l’on répond contenant l’heure, lorsque l’on reçoit la trame 02 03 0B B9 00 1E 16 03 ? Le 10 ou 04, c’est le code fonction Modbus ? Ou alors parles tu de la trame à l’adresse 04 43 ?
Si c’est ça, sur quels octets pousses tu le target, 27 28 comme sur le programme arduino d’origine ?

Je vais faire quelques essais cette après-midi, je n’ai pas encore exploré les trames en 04 43 …

Merci bien, je suis très intéressé car pour ma part je cherche a piloter la consigne de ma pac en fonction de la production solaire, afin de moduler la puissance en fonction de mon surplus d’énergie.

Pour le problème de démarrage de la PAC lors du changement de consigne, le problème c’est qu’avec le programme arduino d’origine, on remplace systématiquement les octets de mode par la variable m_mode, lors de la création de la trame il faut plutôt y mettre le mode actuel, et remplacer par m_mode seulement si changement de mode.

J’ai fait cela en créant un tableau par registre (0B B9, 07 D1, 03 E9, …), j’écris dessus lorsque je change de mode et je transmet la trame modifiée.
Je met a jour le tableau lorsque je reçoit le broadcast correspondant, comme cela si on change de mode ou autre depuis l’IHM, c’est mis à jour dans l’ESP.

Courage, on y est presque :crossed_fingers:

Bonjour @andrec,

En effet j’ai ces mêmes trames supplémentaires vers l’adresse 2, j’y répond de cette manière pour éviter ces répétitions de messages (Réponse à une écriture Modbus, code fonction 0x10):

Pour les réponses suite à une instruction en 0x10 à faire sur les 3 demandes suivantes :
02 10 04 43 00 5A B4 57 … longueur 189
02 10 03 E9 00 5A B4 57… longueur 189
02 10 0B B9 00 0B 16 57 … longueur 31

Je vais essayer d’être clair et concis sur la trame 65 en réponse à 02 03 0B B9 00 1E 16 03
On place 0x10 ou 0x04 en position 25 suivant ce que l’on veut faire , je laisse les mots de l’heure à 00

2 3 3C 57 46 32 30 30 32 32 37 30 34 34 33 0 0 0 0 1 1 0B B9 0 10 0 0 0 0 0 0 0 11 0 20 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 AD 2E

Ou

2 3 3C 57 46 32 30 30 32 32 37 30 34 34 33 0 0 0 0 1 1 0B B9 0 4 0 0 0 0 0 0 0 11 0 20 0 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ED 5C

Si on ne change que des modes c’est 0x04 qui est placé dedans.
D’autre part, au démarrage la première trame de 65 lancée par l’esclave en 01 contient un 0x80 sur la position 24, je n’ai pas encore eu le temps. de vérifier si il s’agissait d’une demande en lecture des paramètres vers le maitre. Mais on ne la voit passer qu’une fois lors de l’allumage électrique de la PAC.

Pour illustrer ici un exemple en 01 mais le principe est le même, il y a un premier passage avec un 0x10 et un second en 0x04

le message 8 entre la trame 65 et la 185 est donné par le maitre pour ok attente des nouveaux settings

Ensuite la séquence avec les 0x10 :

Un peu de code joint :
esp8266_majestic.ino.txt (19,8 Ko)

Il manque sûrement un peu d’optimisation et de fiabilisation car pas encore controlé que tout se passe bien entre une action alternée en 01 ou 02

  • Terminer sur le silent mode
  • Il reste un Bug je ne voit pas le stop compresseur sur une consigne inférieure à Tin ou Tout en Heat mode et à cette étape l’afficheur ne prends plus le target.
    -Regarder aussi comment voyagent les bornes min et max suivant le mode 8 - 35° Pour cold et Auto versus 15° - 35 ° pour Heat.

De mon coté j’allais implémenter un payload multiple qui reprends tous les paramètres lors d’un ordre, mais le tableau par registre m’interpelle pour la gestion d’état de paramétrage si c’est plus efficace. Peux tu peux m’en dire un peu plus sur son implémentation ?

Presque fait comme tu dis !!
Merci

1 « J'aime »

Bonsoir @chris99977

Un énorme merci ! Grâce à toi je parviens maintenant aussi à piloter la consigne, les explications sont parfaites, merci aussi à tout ceux qui ont contribué à ce projet !

Pour le bug du compresseur qui visuellement ne passe pas en stop si target < à Tin ou Tout et autre, je vais tester ça demain.

Je confirme qu’avec la gestion par « registres » (Des tableaux), pas de soucis de modification du mode lors de la modification de la consigne.
Je pense que c’est ce qu’il y a de plus simple, il y a un tableau par adresse (A ce propos, les adresses 07 D1 et 04 43 se chevauchent du au nombre de datas, mais les datas ne sont pas du tout les même à ce niveau, ce n’est donc pas du Modbus classiquement implémenté, pas d’accès mémoire direct, il y a du traitement entre deux), et j’ai aussi multiplié cela par deux pour les essais, un jeu de tableaux de recopie de ce qu’on voit passer vers et depuis l’IHM, et nos tableaux, identiques, cela donne donc les tableaux suivants (Je dois mettre ça au propre) :

uint8_t holding_register_broadcast[256];            //Adresse 07 D1 (Unit state)
uint8_t holding_register_parametres_ihm[256];       //Adresse 03 E9 (Paramètres, Mode)
uint8_t holding_register_action_ihm[256];           //Adresse 0B B9 (Heure IHM, Action)
uint8_t holding_register_0443_ihm[256];             //Adresse 04 43 (?)
uint8_t holding_register_parametres_gateway[256];   //Adresse 03 E9 (Paramètres, Mode)
uint8_t holding_register_action_gateway[256];       //Adresse 0B B9 (Heure module WiFi, Action)
uint8_t holding_register_0443_gateway[256];         //Adresse 04 43 (?)

Lorsqu’on reçoit les datas correspondantes (Broadcast, ou écoute des échanges avec l’IHM), on les recopie dans le bon tableau, exemple :

else if (msg[2] == 0x04 and msg[3] == 0x43) {           //Paramètres
  PUB("WARMPOOL/D00", String(XtoFloat(27, 28)).c_str());  //Aussi nommé D01 sur IHM
  PUB("WARMPOOL/D01", String(XtoFloat(29, 30)).c_str());
  PUB("WARMPOOL/D02", String(XtoFloat(31, 32)).c_str());
  PUB("WARMPOOL/D03", String(XtoInt(33, 34)).c_str());

  debugW("Ecriture Broadcast 0443 Parametres");

  for (uint8_t i = 0; i < msg[6]; i++) { //msg[6] = nombre d'octets de datas
    holding_register_0443_gateway[i] = holding_register_0443_ihm[i] = msg[i + 7];
  }
}

Lorsqu’on fait une action MQTT, on écris dans la bonne case du tableau adéquat pour y écrire soit la consigne, soit le mode, ainsi que la demande de prise en charge par le contrôleur (0x04 ou 0x10, encore merci), exemple :

else if (topic.startsWith("WARMPOOL/set/")) {
  if (topic.endsWith("target")) {
    m_target = payload.toFloat() * 10;

    holding_register_parametres_gateway[24] = highByte(m_target);
    holding_register_parametres_gateway[25] = lowByte(m_target);

    holding_register_0443_gateway[94] = highByte(m_target);
    holding_register_0443_gateway[95] = lowByte(m_target);

    holding_register_action_gateway[21] = 0x10;
    state.dirty = true;
  } else if (topic.endsWith("mode")) {
    if (payload.equals("OFF")) m_mode = 0x00;
    else if (payload.equals("Heat")) m_mode = 0x84;
    else if (payload.equals("Cool")) m_mode = 0x81;
    else if (payload.equals("Auto")) m_mode = 0x88;
    else if (payload.equals("ON")) m_mode = 0x01;

    holding_register_parametres_gateway[21] = m_mode;
    holding_register_parametres_gateway[27] = m_mode;

    holding_register_action_gateway[21] = 0x04;

    state.sub = 0x02;
    state.dirty = true;
  }
}

Ensuite, le contrôleur nous envoi donc une requête de lecture, nous n’avons qu’à reconstruire l’entête en fonction de la demande, et transmettre les datas du tableau:

else if (msg[0] == 0x02) {                //La PAC communique avec le module WiFi
  if (msg[1] == 0x03) {                   //La PAC lis depuis le module WiFi

    uint8_t RPLY[(XtoInt(4, 5) * 2) + 3]; //On répond une trame avec le nombre de mots demandées dans la requête de lecture

    //Préparation entête
    RPLY[0] = msg[0]; //Adresse équipement qui a reçu la requête et qui répond (Nous, le même que la requête)
    RPLY[1] = msg[1]; //Code fonction (Le même que la requête)
    RPLY[2] = XtoInt(4, 5) * 2; //Nombre d'octets de datas envoyés (Le nombre de mots demandés * 2)

    if (msg[2] == 0x03 and msg[3] == 0xE9) {      //La PAC lis depuis le module WiFi à l'adresse 03 E9
      TypeMessage = 5;

      if (holding_register_parametres_gateway[0] != 0) {  //On a les informations nécessaires à l'envoi de la trame
        //Préparation trame (Lecture trame de base)
        for (uint8_t i = 0; i < RPLY[2]; i++) {
          RPLY[i + 3] = holding_register_parametres_gateway[i];
        }

        debugW("Reponse x02 (Parametres)");
        sendmsg(RPLY, sizeof(RPLY));

      }
      else {
        debugE("Buffer holding_register_parametres_gateway vide, patientez le temps de decouvrir la trame echangee avec l'IHM.");
      }

De cette manière, la consigne et le mode seront toujours à jour: Pas de soucis de repassage au mode d’avant lorsqu’on change la consigne par exemple, en plus on a une trame identique a ce qu’aurait envoyé l’IHM, sans avoir a modifier le programme.

Voici mon programme, brut de décoffrage de mes essais d’aujourd’hui … J’ai encore du boulot de nettoyage et optimisation, il ne ressemble pas beaucoup au code d’origine mais l’idée est là :

/!\ Attention, suite à mes essais j’ai un bug avec ma PAC, la consigne semble figée à une température basse, même si au niveau de l’affichage écran je peux la changer (En mode chaud, le compresseur ne démarre pas, en mode froid il démarre et refroidis l’eau alors que la consigne est au dessus, et en mode auto idem) J’ai donc retiré le code au cas ou le temps de corriger cela /!\

1 « J'aime »

Hello André,

Merci pour tes explications c’est top.

/!\ Attention, suite à mes essais j’ai un bug avec ma PAC, la consigne semble figée à une température basse, même si au niveau de l’affichage écran je peux la changer (En mode chaud, le compresseur ne démarre pas, en mode froid il démarre et refroidis l’eau alors que la consigne est au dessus, et en mode auto idem) J’ai donc retiré le code au cas ou le temps de corriger cela /!\

Pour le bug cela me semble lié j’ai trouvé une erreur dans la construction de la trame 185 en poursuite d’un 65 type 10 la consigne est au mauvais endroit dedans.

Quand on y réfléchis c’est pas si délirant car la conséquence est de diffuser la consigne mais pas de la passer au contrôleur ce qui crée ce phénomène. Mon afficheur remonte aussi dans ses logs l’erreur E08 communication error.

Dans le code pour cette trame passer les positions du target de 97 98 à 94 et 95.
J’ai à priori maintenant une pac qui s’arrête lorsque le target est atteint ou si la consigne évolue à la volée.
Ça semble mieux.

Christophe

1 « J'aime »

Hello,

Avec plaisir.

Pour le bug, c’est encore mystérieux pour moi, ce qui m’inquiète c’est que même avec le montage déconnecté, et en faisant les actions depuis l’écran de la PAC, je n’ai pas un comportement normal de la PAC …

C’est « tombé en marche » pendant quelques jours en faisant des essais, et là je me retrouve a nouveau bloqué, sans raison apparente.

Je pense avoir écrasé des réglages usine au début de la trame 0443, si quelqu’un a la même PAC (Hayward ECPi30MA) je suis très preneur du contenu des trames 0443 et 03E9 (Dans le fichier Excel dispo plus haut dans ce fil, il me semble que ce ne sont pas les mêmes modèles ?) …
@jeje32, j’ai vu que tu avais la même pompe, mais dans les fichiers Excel que tu as partagé il n’y a pas les trames 0443, les aurais-tu de côté ?
@titi2097, même modèle aussi, si tu as déjà l’ESP en fonctionnement, tu dois pouvoir voir passer les trames via RemoteDebug …

En tout cas, avant toute manipulation, pensez a sauvegarder le contenu de vos trames 03E9 et 0443, il y a aussi des réglages/calibrations usine dedans.

Entre temps j’ai pas mal avancé sur le programme, je commence aussi a avoir quelque chose d’abouti, écrire dans le bon target en fonction du mode, prendre en compte les bon mini/maxi, gestion du mode silence (Mais pas des timers), gestion des modes.

Concrètement voici le problème :

Lorsque je met en marche la PAC, mesure < consigne, si elle est en mode chaud: Le compresseur ne démarre pas.
Si elle est en mode auto, elle se met a refroidir l’eau.
Si en mode chaud, je modifie la consigne: Rien ne se passe.
Si en mode auto, je modifie la consigne: Fonctionnement normal rétabli elle chauffe l’eau, je peux même revenir en mode chaud.
Si la PAC est démarrée en mode chaud, le modifie la consigne, je passe en mode auto: Elle chauffe l’eau, je peux revenir en mode chaud.

Donc voilà, à la mise en marche (Depuis l’écran ou depuis l’ESP) je suis systématiquement obligé de changer la consigne et de passer par le mode auto mode pour que tout démarre normalement.
Ensuite plus de problèmes, ça régule.

J’ai analysé les datas échangées pendant ces essais, aucune data ne changent pour des valeurs inattendues, je vois bien les changements de mode, consigne, sans rien de particulier.

Le problème ne provient pas de l’ESP mais bien du contrôleur même, si quelqu’un a le même problème…

Concernant le programme ESP, il est bien avancé, toutes les actions sont maintenant possibles, démarrage/arrêt, changement de modes, de consigne, prise en compte de la bonne consigne en fonction du mode, prise en compte de bornes mini/maxi consigne en fonction du mode, mode silence, activation/désactivation/modification des timing de démarrage/arrêt et du mode silence, tout est maintenant possible.

Au démarrage de l’ESP, on provoque la lecture des trames 03E9 et 0443 afin d’en récupérer le contenu et de ne pas écraser les paramètres.

Je vais voir pour intégrer WiFi Manager afin de rendre tout ça plus « User Friendly ».

Voici la version actuelle :
esp8266_warmpool_andrec7_beta.zip.txt (13,1 Ko)

2 « J'aime »

topissime
je vais testé direct :slight_smile:

merci

1 « J'aime »

je dois avoir un soucis j’ai rien qui remonte ^^

ci-joint le debug obtenu via remote debug.

Je vois dans ton code de nombreux commentaires '//La PAC lis depuis le module WiFi "

tu as laissé le module wifi de branché en // ?

image

pac remotedebug.txt (153,7 Ko)

J’ai augmenter la taille du RingBuf et c’est bcp mieux… je continue a test

//RingBuf<uint8_t, 266> msg; //Trame reçue, pas encore traitée
RingBuf<uint8_t, 500> msg; //Trame reçue, pas encore traitée