J’ai jeté un coup d’œil, mais c’est trop de code, franchement, j’ai pas envie d’étudier ça, ça va me prendre des heures. En plus c’est indiqué que c’est obsolète en début de readme.
Par hasard, j’ai interrogé Chat GPT! pour ce code:
GitHub - Benoit3/Diematic: Web Interface for Diematic3 regulator
Oui — dans ton Diematic.class.php, le “truc spécial” n’est pas dans la valeur envoyée au registre 17, mais dans la séquence d’écritures que le code fait pour être sûr que la chaudière “prenne” le changement de mode.
1) Registre 17 = “DEROGATION A” (mode circuit A)
Dans ta classe :
$this->diematicReg['MODE_A']->addr=17;
$this->diematicReg['MODE_A']->type=self::BIT;
Et d’après la table MODBUS, l’adresse 17 correspond bien à “DEROGATION A” (commande de dérogation/mode).
Bits utiles (ce que représentent tes constantes)
Tes constantes :
ANTIICE = 1→0b00000001→ bit 0PERM_NIGHT = 2→0b00000010→ bit 1PERM_DAY = 4→0b00000100→ bit 2AUTO = 8→0b00001000→ bit 3
Et le tableau “D1” (définition des bits) confirme bien cette logique :
bit3 = AUTO, bit2 = JOUR, bit1 = NUIT, bit0 = ANTIGEL.
Donc, pour le registre 17 (circuit A), en pratique :
- Auto =
8(0x08) - Jour =
4(0x04) - Nuit =
2(0x02) - Hors-gel =
1(0x01)
2) Ce que fait setModeA() exactement (construction de la valeur)
$this->diematicReg['MODE_A']->set = ($mode & 0x2F) | ($mode_ecs & 0x50);
$this->diematicReg['MODE_A']->isset = 1;
$this->diematicReg['NB_JOUR_ANTIGEL']->set = 0;
$this->diematicReg['NB_JOUR_ANTIGEL']->isset = 1;
Les masques
0x2F = 0010 1111b→ autorise surtout bits 0..3 + bit50x50 = 0101 0000b→ autorise surtout bit4 + bit6
L’idée : ne pas envoyer n’importe quoi dans le registre (certains bits sont “spéciaux”/réservés selon les versions, et d’autres peuvent être des statuts/alertes non pertinents en écriture).
Mais pour ton besoin Jour/Nuit/Antigel/Auto, c’est essentiellement bits 0..3 qui comptent.
3) La “particularité” : la chaudière n’accepte pas toujours une écriture unique → le code “force” l’acceptation
La partie importante est dans synchro() quand le bus passe en “master” et qu’il voit MODE_A->isset == 1.
Cas général (AUTO / JOUR / NUIT / etc.)
Le code fait plusieurs écritures :
- envoie
MODE_Aune première fois - met
NB_JOUR_ANTIGEL = 1et l’envoie - renvoie
MODE_A - attend 0,5 s
- renvoie encore
MODE_A - remet
NB_JOUR_ANTIGEL = 0et l’envoie
Concrètement (c’est exactement ce que fait ton code) :
masterTx(MODE_A)
NB_JOUR_ANTIGEL=1 ; masterTx(NB_JOUR_ANTIGEL)
masterTx(MODE_A)
usleep(500000)
masterTx(MODE_A)
NB_JOUR_ANTIGEL=0 ; masterTx(NB_JOUR_ANTIGEL)
C’est ça le “handshake” / contournement : un changement de mode est “poussé” plusieurs fois, et encadré par un “pulse” sur le registre 13.
Cas ANTIICE (hors gel)
Le code fait une variante :
- il envoie
MODE_A - puis
NB_JOUR_ANTIGEL = 1 - pause
- puis
NB_JOUR_ANTIGEL = 0 - puis renvoie
MODE_A
4) Pourquoi ce “pulse” sur NB_JOUR_ANTIGEL (registre 13) peut aider ?
Le registre 13 est bien “NB JOURS ANTIGEL”.
Dans la vraie vie Modbus/RS485, certains régulateurs ne prennent pas toujours une commande “dérogation” si :
- la trame tombe au mauvais moment (bus “pas assez silencieux” / collision / timing),
- la régulation interne n’échantillonne la commande que sur certains cycles,
- ou la commande “dérogation” doit être accompagnée d’un autre changement pour être validée (effet “commit” côté firmware).
Le code utilise donc un registre “inoffensif” (13) pour créer un changement d’état garanti (0 → 1 → 0), ce qui “réveille”/force le traitement, puis il répète la commande de mode pour maximiser les chances qu’elle soit acceptée.
C’est très typique des intégrations “terrain” : ce n’est pas élégant, mais ça marche.
5) Si tu veux reproduire ça dans ton propre envoi Modbus (recommandation simple)
Pour passer en Jour ou en Auto de façon fiable, reprends la logique du code :
- Écris registre 17 avec
4(Jour) ou8(Auto) - Écris registre 13 =
1 - Réécris registre 17
- Attends ~500 ms
- Réécris registre 17
- Remets registre 13 =
0
Et idéalement tu vérifies ensuite l’état via une lecture (si tu as un registre “retour d’état” pertinent côté chaudière).
Je vais regarder dans la version actuelle en python:
GitHub - Benoit3/Diematic_to_MQTT: MQTT interface for De Dietrich Diematic3 heater regulator written in python
Alors…
La particularité de la chaudière est que toutes les 5 secondes environ, la chaudière passe de serveur à client (anciennement, on parlait d’esclave et de maitre). Comme il n’est pas possible de déterminer dans quel mode elle est ni pour combien de temps exactement, l’écriture est répétée jusqu’à ce qu’elle soit acceptée.
D’autre part, le registre 13 n’est touché que si le mode n’est pas « antigel », si le mode est antigel, le registre 13 n’est pas touché.
Donc l’analyse de l’IA est fausse.
Pour moi, dans un scénario il faut :
- sauvegarder les registres 19 et 20 dans un virtuel,
- écrire le changement de mode correctement,
- restaurer les virtuel vers les registres 19 et 20
L’écriture avec plusieurs essais (10 ou +) et un timeout à 1 ou 2 secondes. De cette manière, au bout d’un moment ça passera.
Hello,
j’ai mis en place le scenario pour sauver et restituer les 2 registres « écrasés », mais cela n’est pas satisfaisant à mon sens, je pense que d’autres problèmes vont se présenter quand je vais aller sur d’autres registres
J’ai trouvé la doc ci dessous, comprends tu le sujet du format de transmission 00 +1 BIT (pour le registre 17) ?
peux tu m’aider à le coder pour tester stp?
Le format spécifique du REG17:
OK… et donc il faudra s’adapter, je ne vois pas de problème à ça
Tu as la possibilité de tester la communication avec ta chaudière. Si tu trouves un meilleur moyen n’hésite pas à le mettre en œuvre. Moi, d’après ce que tu me dis, c’est la solution que je propose.
C’est écrit : 00 + 1 BYTE et pas 1 BIT.
1 Byte (en anglais) = 1 octet = 8 bits
Et donc 00 + 1 BYTE signifie que seul l’octet de poids faible est utilisé, en supposant que c’est représenté en hexadécimal.
Ca veut dire qu’il ne faut écrire que des valeurs de 0 à 255 en uint16.
0x00 représente un octet valant 0. 0x0000 représente un mot (2 octets ou un registre Modbus) valant 0.
Volontiers. Tu souhaites pouvoir envoyer quelles combinaisons ?
Quelles sont les commandes que tu as dans ton équipement MyModbus ? (histoire que je me base sur ce que tu as déjà)
Simple information :
D’après un document qu’on m’avait fourni, il semblerait que le registre 653 permet de lire le mode de dérogation du circuit A. Ce registre est en lecture seule et est construit exactement comme le registre 17.
Bonjour,
problème clos, il fallait faire un FC16 (Write multiple register) sur le REG17 pour changer le mode (1 2, 4 ou 8) au lieu d’un FC06 qui fait bugger la carte mère de la chaudière
si ça peut servir à d’autres ![]()
Merci encore
Simon
Je confirme c bizarre de faire du FC16 pour changer un registre, mais ça fonctionne parfaitement sans effet de bord sur d’autres paramètres.
Cela pour le changement de mode Auto/Jour/Nuit/HGEL (REG17) et le changement de programme horaire du circuit A (REG231) P1/P2/P3/P4 selon mon équipement ci dessous:
Les autres paramètres passent bien en FC06 sans effet de bord (heures/minutes, pente, influence sonde ambiance A, températures)
J’ai exactement le même probléme sur ma chaudiére, lors d’écriture de temps de jour ou de changement de mode.
j’ai la pente qui passe à 0 et la programmation du circuit d’eau chaude qui s’efface.
Je vais faire le test d’écrire en FC16.

