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

Pour le programme c’est pas moi mais mon pote qui a géré . Il a fait un programme différent car il gère plusieurs choses à sa façon.
Par contre tu peux sans problème utiliser le programme de freddye83 sans trop de modifications.

Merci! Je vais brancher correctement les cables et tester a nouveau.

Ok tiens nous au courant.
tu devrais avoir les mêmes trames que moi.

À savoir que si tu as les mêmes trames que jeje32, il faudra faire quelques petites modifs, car ce n’est pas les mêmes adresses.

Merci a vous deux. Maintenant j’ai des trames et j’arrive a sortir des info par mqtt (tin et tout). Les commandes pour changer le target ne marchent pas, mais ça doit etre ce que tu dis des addresses.

Je vais essayer ce soir de regarder les excels et voir si j’arrive a faire les modifs. Je vous tiens au courant.

Merci!

Salut a tous!

Le site de Hayward (http://smartemp.hayward.fr:9000/login) semble dead et donc le plugin Hayward ne fonctionne plus car il l’utilise …

J’ai fait des recherches et j’arrive a communiquer avec le web service utilise par l’app sur les smartphone :
http://www.phnixsmart.com/Phnix.WaterHeater.WebService/SmartDeviceService.asmx

J’ai cependant des problemes a comprendre comment est construit un Byte Array…
Pourriez-vous jetter un coup d’oeil ici ? :

https://community.jeedom.com/t/serveur-hayward-injoignable/65132/13

Votre aide est la bienvenue !

Merci,

Sebastien

Salut Sattaz,

Je ne sais pas si on va pouvoir t’aider car les pac inverter elles pointent vers le serveur suivant :
http://pdms.phnixsmart.com:9112/app/user/login

par sur que le web service associé derrière soit identique. ici on essaie de dépioter les trames balancés par les esclaves/maitre en RS485 c’est verbeux mais le seul moyen est d’observer ce qui. change suivant l’action de commande effectué.

Salut @jeje32

j’ai pas mal joué avec mon module et snifé ce qui se passe quand je fais un set target par l’appli
une succession de messages (189) commencent par 02 10 04 43

par contre je suis toujours au meme point que @ccorderor mes commandes target et mode ne fonctionnent pas, sais tu ou modifier le code du git pour que les ordres soient bien expédiés avec la bonne adresse ?

Sinon
T5 correspond à la température d’air extérieur de la PAC
T6 température du condenseur (ou sortie de compresseur)
T4 et T1 coté évaporateur
R11 0 = Mode froid de la vanne 4 voies 1= Mode chauffage de la vanne 4 voies
R18 correspond au statut du relais d’asservissement 0 = OFF 11=ON 8= temporisation vers Off

Christophe

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 »