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 :
<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).
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)
<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).
Le perfectionnement de soi et l'accession à sa légende personnelle passe obligatoirement par le partage de son savoir et de son expérience avec les profanes en demande d'initiation. (R. Bach)