[LUA] Gestion des données TELEINFO (Triphasé - Tempo)

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
TCA
Messages : 1
Inscription : 07 mai 2017, 10:55

[LUA] Gestion des données TELEINFO (Triphasé - Tempo)

Message par TCA »

Bonjour,

Nouveau sur Domoticz, le forum et LUA je cherchais à lire en temps réel l'ampérage utilisé sur chacune de mes phases à l'aide de la prise TELEINFO de mon compteur. N'ayant pas réussi à trouver ce type de script sur internet, j'en ai écrit un que je vous propose ci dessous.

Ce script en LUA permet de lire depuis la prise TELEINFO du compteur EDF les informations suivantes (Compteur TRI-PHASE avec option TEMPO) :
  • - La couleur du jour et la période tarifaire en cours
    - La couleur du lendemain
    - L'ampérage utilisé pour chaque phase
    - La puissance instantanée consommée
    - l'indicateur de dépassement de capacité du compteur
Principe de fonctionnement :

Un modem, type prise TELEINFO relié au compteur, est branché sur le port série (sur mon Pi il est branché sur le port USB1 (/dev/ttyUSB1))

L'affichage des données sur l'interface nécessite les capteurs virtuels suivants :
  • - Un "ampère triphasé" : intensité consommée sur chaque phase
    - Un "custom sensor" (unité V.A) : consommation instantanée totale
    - un "texte" : Couleur du lendemain ("---", "Bleu", "Blanc" ou "Rouge")
    - un "texte" : Couleur du jour ( "Bleu", "Blanc" ou "Rouge")
    - un "texte" : Période actuelle ("Creuse" ou "Pleine")
    - un "interrupteur" type "On/Off" : Délestage en cours
L'ajout du script LUA suivant dans les évènements (Type "LUA" en mode "Time") permet la gestion de ces capteurs :

Code : Tout sélectionner

--
-- TCA - Script de gestion des données TELEINFO du compteur EDF
--

commandArray = {}
ligne=""
pos=0
delestage = 'Off'

print ("TCA - Lecture TELEINFO V1.0.0")

-- Ouverture du port série
rserial=io.open("/dev/ttyUSB1","r")

ligne=rserial:read()
    
-- Attente début de trame
-- Les trames commencent par ADCO
while string.sub(ligne,1,4)~="ADCO" do
    ligne=rserial:read()
end

-- Attente fin de trame 
-- Les trames finissent par MOTDETAT
while  string.sub(ligne,1,8)~="MOTDETAT" do
    
    if string.sub(ligne,1,6)=="DEMAIN" then
        -- Couleur TEMPO du lendemain : Idx 19
        
        chaine=string.sub(ligne,8,#ligne-2)
        
        if (otherdevices['EDF - Demain']~= chaine) then
             commandArray[pos]={['UpdateDevice'] = 19 .. '|0|'.. chaine}
             pos=pos+1
        end
        
    elseif  string.sub(ligne,1,6)=="IINST1" then
        -- Intensité phase 1 : Idx 18
        int1=tonumber(string.sub(ligne,8,#ligne-2))
        
    elseif  string.sub(ligne,1,6)=="IINST2" then
        -- Intensité phase 2 : Idx 18
        int2=tonumber(string.sub(ligne,8,#ligne-2))
        
    elseif  string.sub(ligne,1,6)=="IINST3" then
        -- Intensité phase 3 : Idx 18
        int3=tonumber(string.sub(ligne,8,#ligne-2))
        
    elseif  string.sub(ligne,1,4)=="PAPP" then
        -- Puissance (V.A) : Idx 32
        commandArray[pos]={['UpdateDevice'] = 32 .. '|0|'.. tonumber(string.sub(ligne,6,#ligne-2))}
        pos=pos+1
    elseif  string.sub(ligne,1,4)=="PTEC" then
        -- Période et couleur en cours
        
        -- Période en cours : Idx 34
        code = string.sub(ligne,6,7)
        
        periode=code
        if (code=="HP") then
            periode="PLEINE"
        elseif (code=="HC") then
            periode="CREUSE"
        end
        
        if (otherdevices['EDF - Période']~= periode) then
            commandArray[pos]={['UpdateDevice'] = 34 .. '|0|'.. periode}
            pos=pos+1
        end
        
        -- Couleur du jour : Idx 33
        code = string.sub(ligne,8,9)
        
        couleur=code
        if (code=="JB") then
            couleur="BLEU"
        elseif (code=="JW") then
            couleur="BLANC"
        elseif (code=="JR") then
            couleur="ROUGE"
        end
        
        if (otherdevices['EDF - Couleur']~= couleur) then
            commandArray[pos]={['UpdateDevice'] = 33 .. '|0|'.. couleur}
            pos=pos+1
        end
        
    elseif  string.sub(ligne,1,4)=="ADPS" then
        delestage = 'On'
    end
    
    -- Lecture de la ligne suivante
    ligne=rserial:read()

end

-- Mise à jour interrupteur délestage : idx = 36
if (otherdevices['EDF - Délestage']~= delestage) then
    commandArray[pos]={['UpdateDevice'] = 36 .. '|0|'.. delestage}
    pos=pos+1
end

-- Mise à jour intensité triphasé : idx = 18
commandArray[pos]={['UpdateDevice'] = 18 .. '|0|'.. int1 .. ";" .. int2 .. ";" .. int3}

--Fermeture du port série
rserial.close()

return commandArray

Je pense qu'il est assez facile à adapter pour l'option EJP et le mode MONO-PHASE ainsi que la récupération des dernières informations non prises en compte (Relevé des index du compteur, Option tarifaire, Numéro de compteur, ...)

Références :

http://www.planete-domotique.com/blog/2 ... ation-edf/
TCA
pigloox
Messages : 78
Inscription : 18 janv. 2016, 16:12

Re: Gestion des données TELEINFO en LUA (Triphasé - Tempo)

Message par pigloox »

Salut,

Tu devrais essayer d'installer la version BETA.
Le plugin téléinfo à été complètement réécris et remonte désormais toutes les informations
Raspberry PI 3 & Raspbian 9 (Stretch) sur disque dur, Domoticz Beta Release,
RFX433E + USB Teleinfo + Zwave Stick
Modules Chacon DI-O, Fibaro, Qubino et sondes de températures
Répondre