Piloter une chaudière Weishaupt équipée d’un WCM-COM avec Jeedom, NodeRed et MQTT
4 juin 2019Bonjour à tous,
cette semaine, je vous propose un sujet que j’essayai de boucler depuis longtemps… Celui de piloter ma chaudière Weishaupt avec Jeedom pour l’inclure dans des scénarios (Départ et retour de vacances par exemple).
Avant toute chose, je tiens à remercier Loic74 qui a ouvert le topic Chaudières Weishaupt et partagé les liens vers le site http://dpsg.weinreich.org/ où la partie communication avec la chaudière avait commencée à être traité en 2015. (Cela a été une sacrée piste pour faire cet article)
Je remercie aussi Steve du site http://dpsg.weinreich.org/ qui m’a aidé dans la résolution des problèmes rencontrés
Bon pour commencer une rapide présentation de l’installation.
Nous avons la chaudière reliée au WCM-COM grâce au eBUS. Le WCM-COM est relié au routeur (chez moi c’est la freebox) afin de faire soit une communication direct avec un PC soit de piloter la chaudière via une application Android. Il y a aussi une possibilité d’envoyer des mails d’alerte (Bon j’ai jamais réussi à les faire fonctionner… mais c’est pas grave)
Voilà pour l’architecture livrée avec la chaudière. Maintenant nous allons voir comme insérer Jeedom dedans afin de la piloter et de l’inclure dans des scénarios.
Pour cela, nous allons utiliser plusieurs softs pour arriver à notre fin:
- Jeedom: Pour le pilotage
- NodeRed: C’est un outil de programmation OpenSource créé par IBM et qui servira pour la partie récupération des données et envoie vers commandes la chaudière.
- Mosquitto: C’est un Broker MQTT et qui servira pour la liaison entre Jeedom et NodeRed
Partie 0: Préparation du terrain de jeu et installation des logiciels nécessaires
Installation de Jeedom — > Voir mon précédent article https://miniprojets.net/index.php/2019/05/13/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics/
Installation de Mosquitto –> Je vous conseille le site suivant https://projetsdiy.fr/jeedom-mqtt-objets-connectes-domotique-diy/
Installation de NodeRed –> Je vous conseille aussi le site suivant https://projetsdiy.fr/installer-node-red-raspbian-jessie-lite-raspberry-pi-zero-w/
Récupération de l’adresse IP du WCM-COM –> Voir mon précedent article où je parle de la méthode pour récupérer l’adresse IP d’un matériel brancher sur une freebox https://miniprojets.net/index.php/2019/04/16/hack-dune-prise-alfawise-murale-etanche/ (Pour les autres, je suis désolé mais il faut voir comment faire avec votre Box ou Routeur mais le principe est souvent le même ^^)
Voilà une fois que vous avez tout installé et récupéré l’adresse IP de votre WCM-COM, vous pouvez revenir et continuer la suite de ce tutoriel
Partie 1: Où trouver les identifiants des données utiles de la chaudière
Dans un premier temps, il faut extraire la microSD du WCM-COM.
Couper le circuit d’alimentation de votre WCM-COM (si c’est bien fait il sera sur le même disjoncteur que votre chaudière) afin de travailler en sécurité.
Ouvrez maintenant le boitier (par le bas)
La carte microSD est en haut à droite. Vous pouvez l’extraire.
Maintenant mettez là dans votre ordinateur à l’aide d’un adaptateur. Et copier tout son contenu dans un dossier de votre ordinateur (cela vous permet en plus d’avoir une sauvegarde de la carte SD en cas où elle mourrait comme c’est un peu capricieux ces petites bêtes)
Une fois cette opération faite, vous pouvez la remettre en place, fermer le WCM-COM et remettre en route le circuit électrique.
Maintenant que la chaudière et le WCM-COM se sont remis en route et que la communication est rétablie, vous pouvez vous connecter via un navigateur internet à la page Web du WCM-COM. Par exemple pour moi c’est http://192.168.1.37/
Vous tomber sur la page suivante:
Pour savoir où récupérer les données, je vous invite à cliquer sur Générateur –> WTC-G –> Valeur de Process
Vous aurez la page suivante et si vous gardez le curseur sur Valeur de Process vous verrez un lien apparaitre comme entouré si dessous:
Cela nous sera utile pour savoir où chercher dans le code donc gardez le.
Faites aussi une copie d’écran des pages où sont les données qui vous intéressent, plus tard cela nous facilitera la tâche d’identification des données.
Faites de même sur toutes les pages où vous avez des données qui vous intéresse. Pour moi, c’est juste Valeur de process de Générateur (Pour les données internes) et Utilisateur de Circuits chauf. (Pour le pilotage).
Ce qui me donne les deux fichiers suivants:
- Générateur –> Valeur de process –>../Form_WTC_GW/Form_WTC_G_Prozesswerte.xml
- Circuit chauffage –> Utilisateur –>../Form_Heizung/Form_Heizung_Benutzer_2.xml
Maintenant, il faut aller dans le dossier Websites/script où vous avez copié les données de la carte SD et prendre les fichiers suivants:
- Valeur de process –> Form_WTC_G_Prozesswerte.gz.js
- Utilisateur –> Form_Heizkreis_Benutzer2.gz.js
Il faut maintenant enlever le .js à la fin du nom de fichier ce qui donne
- Valeur de process –> Form_WTC_G_Prozesswerte.gz
- Utilisateur –> Form_Heizung_Benutzer2.gz
Faite une extraction depuis le fichier .gz et vous vous retrouverez avec un fichier js qui sera lisible facilement.
Maintenant ouvrez le fichier avec un éditeur de texte (Exemple notepad++)
Cherchez la fonction function gfctWEBAPP_Start().
En dessous vous auriez un bloc qui ressemble à cela:
Pour Form_WTC_G_Prozesswerte.js
/* infoNr | index | ID | CmdType | MTyp | busk |value|group| method | obj_method_data |Min-Val|Max-Val| MUL | DIV | Step Size| State | update | */
objSiteInfo[0] = new OBJTELEGRAMM( 81, 0 ,"idT0051", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CHECKBOX_RO , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[1] = new OBJTELEGRAMM( 1497, 0 ,"idT05D9", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CHECKBOX_RO , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[2] = new OBJTELEGRAMM( 1498, 0 ,"idT05DA", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CHECKBOX_RO , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[3] = new OBJTELEGRAMM( 466, 0 ,"idT01D2", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CHECKBOX_RO , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[4] = new OBJTELEGRAMM( 82, 0 ,"idT0067_H",TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CHECKBOX_RO , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[5] = new OBJTELEGRAMM( 83, 0 ,"idT0067_W",TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CHECKBOX_RO , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[6] = new OBJTELEGRAMM( 1, 0 ,"idT0001", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CALC_WOP , [null,null,null] , 0, 255, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[7] = new OBJTELEGRAMM( 373, 0 ,"idT0176", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 0, METH_CALC_WOP , [null,null,null] , 0, 255, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[8] = new OBJTELEGRAMM( 138, 0 ,"idT008A", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_CALC , [null,null,null] , 0, 100, 1, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[9] = new OBJTELEGRAMM( 2572, 0 ,"idT0A0C", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[10] = new OBJTELEGRAMM( 2, 0 ,"idT0002", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[11] = new OBJTELEGRAMM( 3101, 0 ,"idT0C1D", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[12] = new OBJTELEGRAMM( 325, 0 ,"idT0145", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[13] = new OBJTELEGRAMM( 12, 0 ,"idT000C", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[14] = new OBJTELEGRAMM( 14, 0 ,"idT000E", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[15] = new OBJTELEGRAMM( 118, 0 ,"idT0076", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 1, METH_TEMP2 , [null,null,null] , (-30), 130, 1, 10, 10, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[16] = new OBJTELEGRAMM( 3158, 0 ,"idT0C56", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 2, METH_CALC_WOP , [null,null,null] , 0, 0, 1000, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[17] = new OBJTELEGRAMM( 3159, 0 ,"idT0C57", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 2, METH_CALC_WOP , [null,null,null] , 0, 0, 100, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[18] = new OBJTELEGRAMM( 700, 0 ,"idT02BC", TEL_STD , TEL_MTYPE_WG, u8CurrentBuskennung, 0, 2, METH_CALC_UNSIGNED_NO_DEC_POINT , [null,null,null] , 0, 5000, 10, 1, 1, ST_UPDATE, UM_UPDATE_ALWAYS );
objSiteInfo[19] = new OBJTELEGRAMM( 5016, 255 ,"idDL" , TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 2, METH_SETCB_DLUW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONCE_NO_SUBMIT );
objSiteInfo[20] = new OBJTELEGRAMM( 5017, 0 ,"idT0000", TEL_LRG , TEL_MTYPE_DIRECT, u8CurrentBuskennung,TEL_MTYPE_WG,2,METH_APPL , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[21] = new OBJTELEGRAMM( 5015, 0 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 3, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[22] = new OBJTELEGRAMM( 5015, 1 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 3, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[23] = new OBJTELEGRAMM( 5015, 2 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 3, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[24] = new OBJTELEGRAMM( 5015, 3 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 3, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[25] = new OBJTELEGRAMM( 5015, 4 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 4, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[26] = new OBJTELEGRAMM( 5015, 5 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 4, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[27] = new OBJTELEGRAMM( 5015, 6 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 4, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[28] = new OBJTELEGRAMM( 5015, 7 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 4, METH_CDLW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[29] = new OBJTELEGRAMM( 5009, 255 ,"idUW" , TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 2, METH_SETCB_DLUW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONCE_NO_SUBMIT );
objSiteInfo[30] = new OBJTELEGRAMM( 5010, 0 ,"idT0000", TEL_LRG , TEL_MTYPE_DIRECT, u8CurrentBuskennung,TEL_MTYPE_WG,2,METH_APPL , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[31] = new OBJTELEGRAMM( 5008, 0 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 5, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[32] = new OBJTELEGRAMM( 5008, 1 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 5, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[33] = new OBJTELEGRAMM( 5008, 2 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 5, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[34] = new OBJTELEGRAMM( 5008, 3 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 5, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[35] = new OBJTELEGRAMM( 5008, 4 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 6, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[36] = new OBJTELEGRAMM( 5008, 5 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 6, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[37] = new OBJTELEGRAMM( 5008, 6 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 6, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[38] = new OBJTELEGRAMM( 5008, 7 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 6, METH_CUBW , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
objSiteInfo[39] = new OBJTELEGRAMM( 5019, 0 ,"idT0000", TEL_GENERIC , TEL_MTYPE_DIRECT, 0, 0, 7, METH_APPL , [null,null,null] , 0, 1, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONLY_SEND );
Pour Form_Heizung_Benutzer2.js:
/* infoNr| index | ID | CmdType | MTyp | busk |value|group| method | obj_method_data |Min-Val|Max-Val| MUL | DIV | Step Size| State | update | */
objSiteInfo[0] = new OBJTELEGRAMM( 274, 0 ,"idT0112HK", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 2, METH_CALC2, [null,null,null] , 0, 255, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[1] = new OBJTELEGRAMM( 5, 0 , "idT0005", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 2, METH_TEMP, [null,null,null] , 10, 35, 1, 10, 5, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[2] = new OBJTELEGRAMM( 8, 0 , "idT0008", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 2, METH_TEMP, [null,null,null] , 10, 35, 1, 10, 5, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[3] = new OBJTELEGRAMM( 297, 0 , "idT0129", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 2, METH_TEMP, [null,null,null] , 8, 85, 1, 10, 10, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[4] = new OBJTELEGRAMM( 298, 0 , "idT012A", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 2, METH_TEMP, [null,null,null] , 8, 85, 1, 10, 10, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[5] = new OBJTELEGRAMM( 270, 0 , "idT010E", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 2, METH_TEMP, [null,null,null] , 2.5, 40, 1, 10, 5, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[6] = new OBJTELEGRAMM( 2580, 0 , "idT0A14", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_TEMP, [null,null,null] , 4, 35, 1, 10, 5, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[7] = new OBJTELEGRAMM( 278, 0 , "idT0116", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_TEMP, [null,null,null] , 8, 30, 1, 10, 10, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[8] = new OBJTELEGRAMM( 2418, 0 , "idT0972", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_CALC2, [null,null,null] , 5, 270, 1, 1, 5, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[9] = new OBJTELEGRAMM( 274, 0 ,"idT0112WW", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_CALC2, [null,null,null] , 0, 255, 1, 1, 1, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[10] = new OBJTELEGRAMM( 19, 0 , "idT0013", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_TEMP, [null,null,null] , 8, 80, 1, 10, 10, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[11] = new OBJTELEGRAMM( 650, 0 , "idT028A", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_TEMP, [null,null,null] , 8, 80, 1, 10, 10, ST_UPDATE, UM_UPDATE_ONCE );
objSiteInfo[12] = new OBJTELEGRAMM( 129, 0 , "idT0081", TEL_STD , TEL_MTYPE_FS, u8CurrentBuskennung, 0, 3, METH_TEMP, [null,null,null] , 0, 10, 1, 10, 1, ST_UPDATE, UM_UPDATE_ONCE );
Maintenant nous pouvons retrouver facilement à quoi correspondent les identifiants de chaque donnée. Pour cela, il suffit de reprendre les captures d’écran que vous aviez faite (Je vous avait dis qu’elles seraient utiles ^^) et de prendre les données dans l’ordre d’arrivée. (Exemple avec « Générateur –> Valeur de process » <–> « Form_Heizung_Benutzer2.js » )
Ce qui donne le tableau suivant:
ID | Nom sur le site |
81 | Flamme |
1497 | Vanne1 |
1498 | Vanne2 |
466 | Pompe |
82 | Chauffage |
83 | Eau Chaude |
1 | Phase fonctionnement |
373 | Défaut |
138 | Point de Charge |
2572 | Température extérieure pondérée |
2 | Demande de chaleur |
3101 | Température départ (eSTB) |
325 | Température fumées |
12 | Température extérieure |
14 | Température eau chaude |
118 | Sonde stock tampon B10 |
3158 | Nombre cycle bruleur |
3159 | Heures fonctionnement bruleur |
700 | Durée depuis dernier entretien |
Je vous conseille de faire vous un fichier excel, cela sera plus simple pour la suite.
Faites ainsi pour toutes les données dont vous aurez besoin.
Voilà nous avons maintenant tous ce qui faut pour démarrer la partie intéressante… Le codage!
Partie 2: Récupération et lecture des données internes de la chaudière
Pour information, Les sources sont CC-BY-NC-SAhttps://creativecommons.org/licenses/by-nc-sa/3.0/fr/
Dans un premier temps, il faut vous connecter via un navigateur internet à l’adresse de votre raspberry où vous avez installé NodeRed sur le port 1880. Exemple chez moi c’est http://192.168.1.16:1880/
Vous allez arriver sur cette page:
En double cliquant sur Flow1, vous pouvez changer le nom afin de lui donner le nom que vous voulez
je l’ai nommé Weishaupt Chaudière et vous pouvez cliquer sur Done
Maintenant que cela est fait, on va construire la stratégie de récupération des données comme ci-dessous:
On commence par selectionner dans la colonne de gauche le bloc inject
En double-cliquant sur le bloc, on va rentrer les caractéristiques nécessaires suivantes:
Avec dans Payload: la trame des données que l’on veux récupérer sous la forme suivante:
{"prot":"coco","telegramm":[[10,0,1,83,0,0,0,0],[10,0,1,82,0,0,0,0],[10,0,1,81,0,0,0,0],[10,0,1,3158,0,0,0,0],[10,0,1,373,0,0,0,0],[10,0,1,138,0,0,0,0],[10,0,1,2572,0,0,0,0],[10,0,1,2,0,0,0,0],[10,0,1,3101,0,0,0,0],[10,0,1,325,0,0,0,0],[10,0,1,12,0,0,0,0],[10,0,1,14,0,0,0,0],[6,0,1,274,0,0,0,0]]}
Dans Topic: le topic de MQTT dans lequel vous voulez écrire les données
Dans Repeat: la fréquence de lecture des données
Dans Name: le nom du bloc ici en Allemand car c’est une capture issue du travail de Steve
Maintenant on ajoute un bloc http request
Que l’on va remplir de la façon suivante:
Pensez à bien mettre l’adresse IP, le Login et mot de passe de votre WCM-COM
Maintenant, nous allons utiliser le bloc function afin de faire le décodage de la réponse
Pour le bloc décode cela donne:
msg.payload = msg.payload.telegramm;
whinfo = {};
whinfo["[6,0,1,274,0,0].name"] = "Mode";
whinfo["[6,0,1,274,0,0].type"] = "BINAIRE";
whinfo["[10,0,1,81,0,0].name"] = "Flamme";
whinfo["[10,0,1,81,0,0].type"] = "BINAIRE";
whinfo["[10,0,1,82,0,0].name"] = "Chauffage";
whinfo["[10,0,1,82,0,0].type"] = "BINAIRE";
whinfo["[10,0,1,83,0,0].name"] = "EauChaude";
whinfo["[10,0,1,83,0,0].type"] = "BINAIRE";
whinfo["[10,0,1,3158,0,0].name"] = "CyclesBruleur";
whinfo["[10,0,1,3158,0,0].type"] = "CYCLE";
whinfo["[10,0,1,2572,0,0].name"] = "AussentempAvg";
whinfo["[10,0,1,2572,0,0].type"] = "TEMP";
whinfo["[10,0,1,2,0,0].name"] = "Waermeanforderung";
whinfo["[10,0,1,2,0,0].type"] = "TEMP";
whinfo["[10,0,1,12,0,0].name"] = "Aussentemp";
whinfo["[10,0,1,12,0,0].type"] = "TEMP";
whinfo["[10,0,1,14,0,0].name"] = "Warmwasser";
whinfo["[10,0,1,14,0,0].type"] = "TEMP";
whinfo["[10,0,1,138,0,0].name"] = "Laststellung";
whinfo["[10,0,1,138,0,0].type"] = "VALUE";
whinfo["[10,0,1,373,0,0].name"] = "Betriebsphase";
whinfo["[10,0,1,373,0,0].type"] = "VALUE";
whinfo["[10,0,1,3101,0,0].name"] = "Vorlauftemp";
whinfo["[10,0,1,3101,0,0].type"] = "TEMP";
whinfo["[10,0,1,325,0,0].name"] = "Abgastemp";
whinfo["[10,0,1,325,0,0].type"] = "TEMP";
for(var i = 0; i < msg.payload.length; i++) {
var obj = msg.payload[i];
var idx = "["+obj[0]+","+obj[1]+","+obj[2]+","+obj[3]+","+obj[4]+","+obj[5]+"]";
var oname = whinfo[idx+".name"]; var otype = whinfo[idx+".type"]; if ((oname !== undefined) && (otype !== undefined)) { nmsg = {}; nmsg.topic = msg.topic + "/" + oname; switch (otype) { case "TEMP": var temp; temp = (obj[6] + obj[7]*256) / 10; nmsg.payload = temp; break; case "VALUE": var value; value = (obj[6] + obj[7]*256); nmsg.payload = value; break; case "CYCLE": var cycle; cycle = (obj[6] + obj[7]*256)*1000; nmsg.payload = cycle; break; case "BINAIRE": var binaire; binaire = (obj[6] + obj[7]*256); nmsg.payload = binaire; break; } // node.warn(nmsg) node.send(nmsg); }
}
return null;
Et pour le bloc ToJson:
msg.payload = {"temperature": msg.payload,"ts": Math.floor(Date.now() / 1000)}; return msg;
On ajoute ensuite le bloc change pour valider le message
Pour finir, on ajoute le bloc mqtt (output)
Que l’on configure avec l’adresse où est installé mosquitto
Pour vérifier que tout fonctionne, on peux ajouter des blocs debug afin de checker le bon fonctionnement
Maintenant vous pouvez cliquer sur Deploy (En haut à droite)
Si tout ce passe bien le système commence à vivre et si vous cliquez sur debug la petite coccinnelle sur le coté, vous verrez les messages arriver et partir
Maintenant allez sur votre installation Jeedom et rentrez dans votre plugin MQTT, vous devriez voir des topics qui se sont créés
Si tout est ok vous pouvez les ajouter dans vos objets (ici j’ai créé l’objet Chaudière Générateur pour les acceuillir
Voilà vous pouvez maintenan lire les données de la chaudière!!!!
Partie 3: Commander les consignes de la chaudière
Pour la commande des consignes de la chaudière, il faut modifier la partie NodeRed et la partie jeedom
On commence par la partie Jeedom.
Dans le plugin MQTT, on recherche le topic de la consigne que l’on veux modifier (ici par exemple Mode)
On clique sur l’onglet Commandes
Cliquez sur Ajouter une commande action et remplissez de la même façon que sur l’exemple (Ici Eté) en pensant à bien mettre /set à la fin du topic.
Le Payload est la valeur à laquelle vous voulez que la variable soit écrite dans le topic (ici, j’ai mis 5 car cela correspond au mode été de ma chaudière). Sauvegardez et maintenant on passe à la partie NodeRed
Pour NodeRed, on retourne à l’adresse 192.168.1.16:1880
Et l’on complète la structure précedente de la façon suivante:
On rajoute le bloc mqtt (input)
On le complète de la façon suivante:
Où l’on met bien l’adresse IP de la Raspberry ainsi que le port 1883 correspondant à mosquitto.
On met le Topic correspondant au set fait dans Jeedom précédement.
On ajoute le bloc function afin de créer la fonction d’encodage et on rempli de la façon suivante:
low = msg.payload % 256; high = Math.floor(msg.payload / 256); req = '{"prot":"coco","telegramm":[[6,0,2,274,0,0,' + low +','+ high +']]}'; node.log(req); msg.topic = "home/weishaupt"; msg.payload = req; return msg;
Vous pouvez maintenant sauver en cliquant sur Deploy
Une fois que c’est fait, mettez la chaudière quand un programme spécifique via le panneau de contrôle mural (Exemple Stand by)
Maintenant, vous pouvez aller sur Jeedom et tester que le contrôle fonctionne. Cliquez sur le bouton Ete.
Si tout est ok vous verrez sur le panneau de contrôle mural le petit parasol apparaitre
Voilà! Maintenant vous avez toutes les clefs pour intégrer votre chaudière Weishaupt à Jeedom
Je mets si dessous la sauvegarde de ce qui est présenté ici
Le github de Steve (je vais le forker pour avoir une version Anglaise)
https://github.com/lairsdragon/nodered-weishaupt
Et le fichier en cas où il ne serait plus disponible
Bonne continuation,
Ferrader
Hello Jérôme,
My French is not good enough to write in (from Belgium Flemish part) but feel free to respond if you like in french ;-).
First of all very nice article. I have managed to get it running on my end 😀 !
I’m now looking if there is a way to configure the heater/burner to away mode. On the thermostat and in the app I can configure the system that we have left the house but this does not change the mode (sticks to mode 11). I have tried to find the ID in the web interface but even there I can’t find a reference to the « away » state.
Hopefully you have some ideas, otherwise I will stick to the plan to set it to summer mode.
Thanks,
Domien
Hi,
I can find his information when i go back to my home. I thinks it’s just another mode number.
BR,
Jérôme
Hi,
you right I don’t find the mode for left of house. I need to go deeper in investigation…
Thanks you for this,
Jérôme Ferrari
It will be indeed the case of finding the correct ID to pass. Maybe someone with an ebus reader can find out the ID.
Not sure if I can sniff the XMPP message sent by the mobile app to discover the ID, I thought these were encrypted. In case of I find something will let you know!
Found the correct ID to change from home to away using Fiddler to trace the XMPP messages towards Weishaupt:
{« prot »: »coco », »telegramm »:[[6,0,2,109,0,0,1,0]]} ==> set away
{« prot »: »coco », »telegramm »:[[6,0,2,109,0,0,0,0]]} ==> set home
Nice!!! Thanks you for your discovery!
Have a nice day
[…] mes articles http://miniprojets.net/index.php/2019/04/16/hack-dune-prise-alfawise-murale-etanche et http://miniprojets.net/index.php/2019/06/04/piloter-une-chaudiere-weishaupt-equipee-dun-wcm-com-avec…car cela sera utile pour la […]
[…] Si vous voulez utiliser le plugin JMQTT soit http://miniprojets.net/index.php/2019/06/04/piloter-une-chaudiere-weishaupt-equipee-dun-wcm-com-avec… si vous utilisez le plugin […]
Un autre Flamand ici (et un peu tardif en plus), je vais quand-même essayer de te féliciter dans ta langue maternelle: Sacre bleu, t’as bien fait là, mes felicitations!!! Ça va me servir d’ici quelques mois quand j’aurais le temps de m’y mettre. C’est tellement bien expliqué et commenté que j’ai plein de confidence en moi-même d’un coup. 😉
Merci beaucoup.
Bookmarked.
Bonjour,
merci pour les encouragements et bonne continuation pour ton projet.
Jérôme