Forum KNX francophone / English KNX forum

Version complète : DPT 229.001
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour à tous,

Je reviens sur le problème du DPT 229.001 sur 6 octets utilisé par Hager pour le comptage d'énergie de ses modules TE 33x. Angry

Ce DPT permet en une seule variable de connaitre la consommation en fonction du tarif. On a donc les 4 premiers octets qui donne la valeur de la conso puis le cinquième octet donne l'index du tarif et le sixième octet est toujours à zéro.

A priori seul Domovea est capable en natif de gérer ce DPT sur 6 octets. Ce DPT n'est même pas implémenté dans LINKNX ce qui fait qu'il m'est actuellement impossible d'exploiter les données en provenance de mon TE331.

Le TE 33x envoie cycliquement la consommation de chaque tarif et ce sur une seule GAD.  il faut donc impérativement pouvoir lire la valeur de l'index pour savoir si la consommation concerne le mode jour, le mode nuit ou tout autre mode en fonction du contrat EDF. J'ai essayé d'attribuer de "faux" DPT (12.xxx ou 13.xxx) à la variable mais ça ne fonctionne pas car on ne récupère pas l'index du tarif.
A noter que ce DPT est utilisé par Hager aussi bien sur le comptage de la télé-info que sur le comptage de la conso des 3 tores.

Quelqu'un aurait-il un script LUA ou toute autre solution pour KNXWEB2 afin de récupérer ces datas (conso ET index)?

Bon WE à tous.
Et si tu paramètre l'objet énergie sur 4 octets (pour avoir uniquement l'énergie) et que tu récupère le tarif sur 1 octet dans une autre AG ça ne te conviens pas ?
(20/05/2017, 09:39:16)Natheu a écrit : [ -> ]Et si tu paramètre l'objet énergie sur 4 octets (pour avoir uniquement l'énergie) et que tu récupère le tarif sur 1 octet dans une autre AG ça ne te conviens pas ?

Pourquoi pas ? .... mais les différents essais que j'ai fait dans ce sens se sont avérés non-concluants car je n'ai aucun moyen de récupérer uniquement le cinquième octet.

Je recois sur la GA la valeur hexa : 05 82 6E 20 02 00
Si je défini l'objet en DPT 5.xxx j'obtiens le tarif = 5 au lieu de 2
Si je défini l'objet en DPT 7.xxx j'obtiens le tarif = 1410 au lieu de 2
On voit donc que LINKNX  se 'cale' à gauche et prend le nombre d'octets défini par le DPT choisi.

Il faut donc passer par la case traitement de chaine de caractères pour en extraire les 4 premiers octets dans une première variable et ensuite le cinquième octet dans une seconde variable.
Dans général tu as bien le format de l'objet énergie sur 4 octets ? Je pensai que l'information tarifaire correspondait au tarif en cours mais en faite ce n'est pas le cas :/
Non l'énergie est sur 6 octets. C'est la puissance qui est sur 4 octets
Tu peux remonter l'énergie uniquement sur 4 octets aussi:

[Image: mini_731361TE330.jpg]

Par contre je ne saisie pas bien le concept de l'énergie par tarif, mise à part pour faire de l'archivage et afficher des graphes selon le tarifs.  Dans ce cas là tu peux donc historier le tarif en cours pour avoir le même résultat.
(20/05/2017, 10:46:40)Natheu a écrit : [ -> ]Tu peux remonter l'énergie uniquement sur 4 octets aussi:

[Image: mini_731361TE330.jpg]

Par contre je ne saisie pas bien le concept de l'énergie par tarif, mise à part pour faire de l'archivage et afficher des graphes selon le tarifs.  Dans ce cas là tu peux donc historier le tarif en cours pour avoir le même résultat.

Exactement ..... il me faut la consommation par tarif pour pouvoir ensuite les afficher sous forme de graphique. avec un incrément de 24H et ainsi voir l'impact de certains consommateurs saisonniers (pompe piscine, chauffe-eau, clim, PAC, .....)
Il existe plusieurs objets tarifs (tarif en cours et tarif suivant de 1 byte et 3 bytes respectivement)
Je n'arrive pas à importer la bibliothèque de cet équipement j'ai une erreur :/

Je pense que tu peux compiler l'historique de la conso avec le tarif en cours, et avoir une conso HC et une conso HP. Ainsi en HC tu stock la conso dans une variable "Conso HC" et en HP dans une variable "Conso HP".

Parce qu'à l'instant T l'objet de 6 octets aura une consommation et un tarif en cours nan ?

Pour moi c'est ce que fait Domovea mais en récupérant qu'un seul objet (celui de 6 octets).
Merci Natheu de t'être penché sur le problème mais ta solution n'est malheureusement pas applicable :
Quand le TE33x envoie les données de consommation sur 6 bytes, il envoie cycliquement les valeurs pour chaque index avec un écart de 5 secondes entre chaque index.

Du coup on ne peux pas se fier à l'index en cours puisque on va recevoir sur une seule et unique GA (séquentiellement toutes les X minutes) la conso en mode jour puis 5 secondes plus tard la conso en mode nuit. Si je ne retiens que les 4 premiers octets j'aurais donc bien la consommation mais je serais dans l'incapacité de savoir si il s'agit de celle du mode jour ou du mode nuit.

Ne pas oublier que l'on peut aussi avoir les anciens contrats dits bleu / blanc  / rouge avec pour chaque période le mode jour et le mode nuit ce qui fait que sur cette fameuse GA on reçoit la consommation de 6 index différents.

Je vous mets une capture d'écran des données bus envoyés par mon TE330
(21/05/2017, 05:57:41)pollux06 a écrit : [ -> ]Il envoie cycliquement les valeurs pour chaque index avec un écart de 5 secondes entre chaque index.

C'est l'info que je ne trouvais pas, je comprend mieux maintenant. Moi j'utilise Jeedom et à priori il gère le format 229.001 :/
En plus j'ai vu que vous aviez déjà étudiés le sujet pour l’intégrer dans KNXweb
Bon après quelques heures à me creuser les méninges j'ai trouvé une solution pour knxweb, solution qui n'est pas la panacée :

1 - créer un objet en DPT29.xxx relié à la GA concernant le télégramme sur 6 bytes.
2 - créer un second objet en DPT12.xxx relié à la même GA. cet objet étant en 32 bits il ne contiendra que la valeur de la consommation.
3 - créer un pour chaque index (2 pour le J/N et 6 pour le E/J/P + J/N) un objet en DPT 12.xxx relié à AUCUNE GA.

Pour extraire l'index il suffit de passer par le script LUA suivant :
index= tonumber(string.sub(string.sub('00'..string.format('%x', 4294967295 and objet_enDPT29),-8),1,2))

Ce script peut-être lancé par une règle qui se déclenchera à chaque changement de valeur de l'objet en DPT29.001

Pour le moment je n'arrive pas à lancer ce script sans erreur mais c'est par manque d'information sur la syntaxe à utiliser au niveau de la règle dans knxweb.

J'utilise la syntaxe suivante :

![CDATA[set(obj("DT_EDF_IDX-Tarif"), tonumber(string.sub(string.sub('00'..string.format('%x', 4294967295 and obj("MachaineenDPT229001"),5,1),16))]] 

qui semble ne rien retourner alors que le script fonctionne parfaitement sous l'interpréteur LUA ?

Une fois l'index récupéré, il suffira de prendre la valeur contenue dans le second objet créé et de l'assigner dans le bon objet créé en 3.

On peux même imaginer passer tous les objets au script LUA et faire une série de IF ... THEN ... ELSE dans le script afin de mettre la valeur dans le bon objet en fonction de l'index .... un truc dans ce style :

function extract_idx (dpt229 , conso, idx1a, idx2a)
    value= tonumber(string.sub(string.sub('00'..string.format('%x', 4294967295 and dpt229),-8),1,2));
    if (value ~= nil) then
        idx_tar=value;
    end;
    if (value==1) then
        idx1=conso;
        idx2=idx2a;
    else
        idx1=idx1a;
        idx2=conso;
    end;
    ghost=conso;
    return idx_tar, idx1, idx2, ghost;
end;
obj("Idx-tarif"),obj("Conso-Idx1"),obj'"Conso-Idx2"),obj("EDF_trigger")=extract_idx (obj("EDF_DPT229"), obj("EDF_Conso"),obj("Conso-Idx1"), obj("Conso-Idx2"));

Pour le moment ce script fait planter linknx ..... alors qu'il fonctionne parfaitement avec l'interpréteur SciTE
Angry
Ayant réussi à trouver l'origine du bug qui faisait planter linknx, je vous livre ci-dessous la méthode pour récupérer les 2 éléments contenus dans un télégramme en DPT 229.001 et les stoker dans des objets sous knxweb.

Tout d'abord il faut créer les objets suivants :
  •    EDF229 --> DPT29.xxx lié à la GA de l'objet en 6 bytes
  •    EDF_conso --> DPT12.xxx lié à la GA de l'objet en 6 bytes
  •    EDF_consoHP --> DPT12.xxx sans liaison avec une GA (stockage de la conso en heures pleines avec ou sans log)
  •    EDF_consoHC --> DPT12.xxx sans liaison avec une GA (stockage de la conso en heures creuses avec ou sans log)
  •    EDF_trigger --> DPT12.xxx sans liaison avec une GA (pour le déclenchement du script)
  •    EDF_Tarif --> DPT5.xxx sans liaison avec une GA (optionnel si l'on veut stocker le n° de l'index)
Ensuite la règle à mettre en place :

       <rule id="MAJ_EDF_229" description="EDF consommation en DPT 229" init="false">
           <condition type="object-compare" id="EDF_conso" id2="EDF_trigger" op="ne" trigger="true" ></condition>
           <actionlist type="if-true">
               <action type="script" delay="" >
               <![CDATA[conso=obj("EDF_conso"); value=tonumber(string.sub(string.sub('00'..string.format('%x', 4294967295 and obj("EDF229")),-8),1,2)); if (value ~= nil) then set("EDF_Tarif",value); end; if (value==2) then set("EDF_ConsoHP",conso); else set("EDF_ConsoHC",conso); end; set("EDF_trigger",conso); ]]>
               </action>
           </actionlist>
       </rule>

Naturellement si il y a plus de 2 index possibles, il faudra adapter le script au niveau du if .... then ... else et créer autant d'objets "conso" que d'index.

NE PAS OUBLIER que pour gérer du 64 bits, il faut que LUA soit installé sur une machine avec une architecture 64 bits et un système d'exploitation 64 bits sinon la fonction retournera systématiquement la valeur hexa FFFFFFFF !!!! ........................ Donc ce script ne peut pas fonctionner sur un raspberry tant que l'OS ne sera pas en 64 bits

ATTENTION : A ce jour ne pas utiliser knxweb pour créer la règle car du fait d'un bug de knxweb, la condition contiendra une erreur qui fera planter linknx

EDIT : Bug corrigé (voir ce post).
J'aurais une question  qui peux sembler incongrue :
Sur les Hager TE33x, on reçoit la consommation électrique pour chaque tarif EDF selon la numérotation suivante :
0 = Tarif de base
1 = Heures creuses (HC)
2 = Heures pleines (HP)
3 = EJP
4 = EJP Pointe mobile
5 = Bleu heures creuses (bleu HC)
6 = Blanc heures creuses (blanc HC)
7 = Rouge heures creuses (rouge HC)
8 = Bleu heures pleines (bleu HP)
9 = Blanc heures pleines (blanc HP)
10 = Rouge heures pleines (rouge HP)

Est-ce que quelqu'un sait à quoi correspond le tarif de base ? Angel

Sur mon installation (système HC/HP) Je reçois des valeurs pour les tarifs 0, 1 et 2. Si j'additionne la conso HP (11731Kw) avec la conso HC (6834kw) je n'obtiens pas la conso tarif de base (8729kw).... donc je ne comprend pas vraiment !!!! Confused
Ca dépend de ton Abonnement EDF.

Le Tarif de base c'est pour ceux qui n'ont pas de tarif avec l'option HC/HP ou EJP.

Si tu es en HC/HP tu ne dois pas en tenir compte, sinon c'est l'inverse.... a moins d'avoir l'option EJP ou là tu utilises les champs 4 a 10.
Filou59 tu sembles confirmer ce que je subodorais.

Comme j'ai un abonnement en HC / HP donc normalement la téléinfo ne devrait envoyer des valeurs que pour les index 1 et 2 et pourtant je reçois des valeurs différentes pour les index 0, 1 et 2

C'est pour cette raison que je me pose la question : à quoi correspond la consommation en index 0 (tarif de base) ?
Non, ca ne marche pas tout a fait comme ca.

Ton compteur dispose d'index qui sont interne et qui ne sont pas resetable.
Il met a disposition sur la teleinfo tous les index indépendamment de ton tarif actuel.

Tu peux vérifier sur plusieurs jour mais ton index sur ton tarif de base ne doit pas changer.
Ca indique simplement qu'il y a eu 8729Kw qui ont été consommé sur ce compteur en tarif de base.

Ca peut être par toi avant de prendre le tarif HC/HP ou alors par qq d'autres avant toi.
Les compteurs ne sont pas forcément neuf lorsqu'il sont installé il peuvent avoir déjà servi.
En cas de changement ou lors d'une installation faut bien vérifié l'index des compteurs pour que ca correspondent bien a ce que l'agent a relevé sinon ca peut poser des prb de facturation.
OK Merci ... je vais vérifier que le tarif de base reste à la même valeur.
@pollux06
Je déterre ce sujet mais comment procèdes-tu finalement pour disposer des historiques HC/HP avec le TE33x ?