Page 1 sur 3

Modification script pour ajout compteur puissance réactive

Publié : 04 janv. 2020, 00:43
par Dim33
Bonjour,

Je me suis inspiré de ce post https://www.domoticz.com/forum/viewtopi ... 14&t=20820 pour fabriquer mon wattmetre avec un ESPeasy et un pzem-004t

J'utilise le script ci-dessous pour afficher les données du pzem et en extraire la tension, l'intensité, la puissance active et la consommation.

Code : Tout sélectionner

--[[Script to read infos from espeasy/pzem-004t and disptach it in correct devices]]--

-- Edit the dummies name below to match yours
local dev_HC      ="Heures Creuses"
local dev_pzem1   ="pzem" 
local dev_V1      ="Tension"
local dev_A1      ="Intensité"
local dev_W1      ="Puissance"

-- End of user-edit part

function UpdateVar(variable,valeur)
    --Update une variable Domoticz
    commandArray[#commandArray+1] = {['Variable:'..variable] = tostring(valeur)}
end

function UpdateDev(device,nvalue,svalues)
    --Met à jour un device numérique Domoticz
    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)}
end

function pzem_read(pzem,HC,dev_V,dev_A,dev_W)
    --[[Read values from a 3ph-amp dummies and dispatch them in sensor for voltage, current, and power
    
    Input :
    pzem : type 3ph amp, updated by espeasy
    HC : switch "On"=happy hours for electricity
    
    Output :
    dev_V : type voltage
    dev_A : type current
    dev_W : P1 smart counter
    ]]--

    local u1, u2, p1, p2
    local val_V,val_A,val_W,val_Wh
    local local_dbg=0

    old_Wh=uservariables[pzem.."_idx"]

    u1, u2, p1, p2 = string.match(otherdevices_svalues[dev_W],"(.-);(.-);(.-);(.-);.*")
    -- Usefull for newly created counters
    u1=u1 or 0
    u2=u2 or 0
    p1=p1 or 0
    p2=p2 or 0

    val_V,val_A,val_W,val_Wh=string.match(otherdevices_svalues[pzem],"(.-);(.-);(%d*);(%d*)")

    if local_dbg==1 then
        print(otherdevices_svalues[pzem])
        print(val_V)
        print(val_A)
        print(val_W)
        print(val_Wh)
    end

    if tonumber(val_V)>1 then UpdateDev(dev_V,0,val_V) end
    if tonumber(val_A)>1 then UpdateDev(dev_A,0,val_A) end
    if tonumber(val_Wh)>=tonumber(old_Wh) then 
        if otherdevices[HC] == 'Off' then
            -- svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD
            UpdateDev(dev_W,0,tostring(u1+val_Wh-old_Wh)..';'..tostring(u2)..';0;0;'..tostring(val_W)..';0')
        else
            UpdateDev(dev_W,0,tostring(u1)..';'..tostring(u2+val_Wh-old_Wh)..';0;0;'..tostring(val_W)..';0')
        end
        UpdateVar(pzem.."_idx",val_Wh)
    end
end

commandArray = {}

if devicechanged[dev_pzem1] then pzem_read(dev_pzem1,dev_HC,dev_V1,dev_A1,dev_W1) end
	 
return commandArray
L'ensemble fonctionne depuis plus d'un an sans problème.

Je souhaiterai afficher un deuxième compteur de puissance réactive (simplement U x I) en plus de celui de puissance active. J'ai tenté de modifier le script ci-dessus sans succès (mes connaissances en lua étant assez basiques).

Merci d'avance pour votre aide.

Re: Modification script pour ajout compteur puissance réactive

Publié : 04 janv. 2020, 09:20
par denis_brasseur
Dans la fonction pzem_read, tu peux facilement calculer ta puissance (simplement U x I)

Code : Tout sélectionner

preactive= val_V * val_A
Commence par faire ce calcul, et affiche le résultat.

Tu gère ensuite la mise à jour de ton deuxième compteur de puissance

Code : Tout sélectionner

UpdateDev('nom de ton device',0,tostring(val_V * val_A))

Re: Modification script pour ajout compteur puissance réactive

Publié : 04 janv. 2020, 18:56
par aleph0
Salut a tous !

Juste pour préciser :
U*I c'est la puissance totale,
UI*cos phi la puissance active
UI*sin phi la puissance réactive

Envoyé de mon moto g(6) en utilisant Tapatalk


Re: Modification script pour ajout compteur puissance réactive

Publié : 05 janv. 2020, 19:16
par Dim33
Merci pour ton aide denis_brasseur. Avant d’écrire ce post, j'ai commencé comme tu l’écris, en affichant val_V * val_A, pas de pb, ça marche.
La ou je bute ..... c'est mettre à jour un nouveau compteur à l'identique de l'autre (avec les heures creuses...). J'ai trituré le code dans tous les sens, sans sucés.

PS : Merci aleph0 pour cette précision. Ma mémoire a failli.

Re: Modification script pour ajout compteur puissance réactive

Publié : 06 janv. 2020, 10:04
par aleph0
J'ai trituré un peu mon script pour rajouter un compteur estimatif de puissance totale. C'était pas un exercice très simple...

Code : Tout sélectionner

--[[Script to read infos from espeasy/pzem-004t and disptach it in correct devices]]--

-- Edit the dummies name below to match yours
local dev_HC      ="Heures Creuses"
local dev_pzem1   ="pzem" 
local dev_V1      ="Tension"
local dev_A1      ="Intensité"
local dev_W1      ="Puissance"
local dev_VA1     ="Puissance Totale"

-- End of user-edit part

function UpdateVar(variable,valeur)
    --Update une variable Domoticz
    commandArray[#commandArray+1] = {['Variable:'..variable] = tostring(valeur)}
end

function UpdateDev(device,nvalue,svalues)
    --Met à jour un device numérique Domoticz
    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)}
end

function pzem_read(pzem,HC,dev_V,dev_A,dev_W,dev_VA)
    --[[Read values from a 3ph-amp dummies and dispatch them in sensor for voltage, current, and power
    
    Input :
    pzem : type 3ph amp, updated by espeasy
    HC : switch "On"=happy hours for electricity
    
    Output :
    dev_V : type voltage
    dev_A : type current
    dev_W and dev_VA : P1 smart counter
    ]]--

    local u1, u2, p1, p2, v1, v2, q, q2
    local val_V,val_A,val_W,val_Wh,val_VA,val_VAh
    local local_dbg=0

    old_Wh= uservariables[pzem.."_idx"]
    old_upt=uservariables[pzem.."_upt"] -- contient l'heure (en sec) de la dernière mise à jour du pzem par la wemos
    
    -- on calcule la durée en secondes depuis l'update précédent, et on la limite à 5min (300 sec) pour éviter de trop grosses erreurs d'estimations en cas de perte de communication
    time = os.time()
    old_upt=old_upt or time -- Utile lorsque la variable vient juste d'être créée mais non encore initialisée
    duree=math.max(time-old_upt,300)
    
    u1, u2, p1, p2 = string.match(otherdevices_svalues[dev_W] ,"(.-);(.-);(.-);(.-);.*")
    v1, v2, q1, q2 = string.match(otherdevices_svalues[dev_VA],"(.-);(.-);(.-);(.-);.*")
    -- Usefull for newly created counters
    u1=u1 or 0; u2=u2 or 0; p1=p1 or 0; p2=p2 or 0
    v1=v1 or 0; v2=v2 or 0; q1=q1 or 0; q2=q2 or 0
    
    val_V,val_A,val_W,val_Wh=string.match(otherdevices_svalues[pzem],"(.-);(.-);(%d*);(%d*)")
    
    --[[ Pour avoir les VAh, on n'a pas de méthode précise :-( car pour être bien fait, le calcul devrait être fait dans le pzem
    En faisant le calcul dans domoticz, on a deux méthodes, qui ont chacune leurs avantages et inconvénients
    Méthode 1 : on intégre les VA dans domoticz. 
    Ceci nécessite de connaître dans domoticz la fréquence de lecture paramétrée dans l'esp, et on ignore tout ce qui peut se passer entre deux réception de valeur dans domoticz. Donc si le courant varie fortement, ou si le wifi est instable; l'estimation est peu précise.
    Méthode 2 : on recalcule les VAh sur la base des Wh (qui eux sont exact) et du cos phi moyen entre deux échantillonnages. l'avantage est qu'on se dispense de savoir la fréquence d'échantillonnage ; l'inconvénient est que si le cos phi varie fortement, l'estimation est peu précise.
    
    On implémente ici la méthode 1 ; la fréquence d'échantillonnage est mesurée comme la durée entre deux update du device pzem
    ]]--
    val_VA=val_V*val_A
    
    if local_dbg==1 then
        print(otherdevices_svalues[pzem])
        print(val_V)
        print(val_A)
        print(val_W)
        print(val_Wh)
        print(val_VA)
    end

    if tonumber(val_V)>1 then UpdateDev(dev_V,0,val_V) end
    if tonumber(val_A)>1 then UpdateDev(dev_A,0,val_A) end
    if tonumber(val_Wh)>=tonumber(old_Wh) then 
        if otherdevices[HC] == 'Off' then
            -- svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD
            UpdateDev(dev_W ,0,tostring(u1+val_Wh-old_Wh)..';'..tostring(u2)..';0;0;'..tostring(val_W) ..';0')
            UpdateDev(dev_VA,0,tostring(v1+val_VA*duree) ..';'..tostring(v2)..';0;0;'..tostring(val_VA)..';0')
        else
            UpdateDev(dev_W ,0,tostring(u1)..';'..tostring(u2+val_Wh-old_Wh)..';0;0;'..tostring(val_W) ..';0')
            UpdateDev(dev_VA,0,tostring(v1)..';'..tostring(v2+val_VA*duree) ..';0;0;'..tostring(val_VA)..';0')
        end
        UpdateVar(pzem.."_idx",val_Wh)
        UpdateVar(pzem.."_upt",time)
    end
end

commandArray = {}

if devicechanged[dev_pzem1] then pzem_read(dev_pzem1,dev_HC,dev_V1,dev_A1,dev_W1,dev_VA1) end
	 
return commandArray
Il faut créer un nouveau compteur de type P1 smart counter qui contientra l'information de puissance totale et renseigner son nom dans la variable "dev_VA1" ainsi qu'un nouvelle variable dont le nom est sur le même modèle que pzem_idx mais avec le suffixe _upt à la place (p.ex pzem_upt) de décimal ou entier (essayer les deux...)

Prendre connaissance du commentaire dans le script sur les méthodes de calcul et leur limites, notament en cas de perte de communication dans ce cas.

Enfin, j'ai modifié le script, mais je ne l'ai pas testé chez moi ; il reste donc sûrement des bugs... postez les erreurs, j'aiderai à résoudre ;-)

Re: Modification script pour ajout compteur puissance réactive

Publié : 06 janv. 2020, 21:46
par Dim33
Chapeau bas aleph0 ! ....... Pas de bugs remontés. ça tourne !

La puissance totale instantanée est OK mais pas la consommation totale :

Consommation : 38.538 kWh
Consommation totale : 431761567.214 kWh

Re: Modification script pour ajout compteur puissance réactive

Publié : 07 janv. 2020, 19:34
par aleph0
On a toujours des valeurs incohérentes le deuxième jour ?

Envoyé de mon moto g(6) en utilisant Tapatalk


Re: Modification script pour ajout compteur puissance réactive

Publié : 07 janv. 2020, 20:30
par Dim33
aleph0 a écrit : 07 janv. 2020, 19:34 On a toujours des valeurs incohérentes le deuxième jour ?

Envoyé de mon moto g(6) en utilisant Tapatalk
Oui, pareil.

Re: Modification script pour ajout compteur puissance réactive

Publié : 07 janv. 2020, 20:47
par aleph0
Vi... me suis un peu gourré dans l'unité de la variable duree : il la faut en heure, pas en secondes :o
remplace la ligne 46 par

Code : Tout sélectionner

duree=math.max(time-old_upt,300)/3600
pis met moi un print(duree) juste après et poste le résultat stp que je vérifie que la mesure de fréquence d'update de la wemos soit realiste...

Re: Modification script pour ajout compteur puissance réactive

Publié : 07 janv. 2020, 22:46
par Dim33
Status: LUA: 0.083333333333333