[LUA] Repartition Consommation HC / HP...

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.
itcitc77
Messages : 73
Inscription : 30 mai 2016, 06:17

Re: Repartition Consommation HC / HP...

Message par itcitc77 »

bonjour a tous j'ai un problème avec le script initiale il ne me remonte pas la valeur de :LastValueCptElecGlobal
voila le log
2016-07-10 18:06:57.595 LUA: -- Calcul Compteurs HC / HP --
2016-07-10 18:06:57.596 LUA: CapteurGlobal = EDF CONSOMMATION
2016-07-10 18:06:57.596 LUA: CapteurCptHP = EDF H.P.
2016-07-10 18:06:57.596 LUA: CapteurCptHC = EDF H.C.
2016-07-10 18:06:57.597 LUA: idxCptHP = 82
2016-07-10 18:06:57.597 LUA: idxCptHC = 81
2016-07-10 18:06:57.597 LUA: flagHP = Compteur Electrique HP
2016-07-10 18:06:57.597 LUA: flagHC = Compteur Electrique HC
2016-07-10 18:06:57.597 LUA: LastValueCptElecGlobal
2016-07-10 18:06:57.597 LUA: LastValueCptElecGlobal = nil
2016-07-10 18:06:57.597 LUA: LastValueCptElecGlobal
2016-07-10 18:06:57.597 LUA: Conso Instant = 804 / Conso Cumule = 759635.5
2016-07-10 18:06:57.597 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_compteurHC-HP.lua: .../pi/domoticz/scripts/lua/script_device_compteurHC-HP.lua:53: attempt to perform arithmetic on local 'lastValueCptElecGlobal' (a nil value)

la valeur dans domoticz
6 lastValueCptElecGlobal Décimal 759444.938
Merci de vos réponses
Domoticz, CustomPage,
Pi3 RFXCom + Razberry;Z-Stick Gen5
itcitc77
Messages : 73
Inscription : 30 mai 2016, 06:17

Re: Repartition Consommation HC / HP...

Message par itcitc77 »

bon cela fonctionne j'ai supprimé la ligne de la variable dans le script et je l'ai retapée, et cela fonctionne bizarre bizarre
Domoticz, CustomPage,
Pi3 RFXCom + Razberry;Z-Stick Gen5
jfpiat
Messages : 10
Inscription : 29 mars 2016, 22:38

Re: Repartition Consommation HC / HP...

Message par jfpiat »

Bonsoir,

J'ai réutitilisé une bonne partie du script placé en première page, mais j'y ai fait quelques ajustements.
J'ai notamment supprimé bon nombre des variables utilisateurs, car je trouvais l'utilisation un peu lourde.
J'ai aussi supprimé l'utilisation de la variable d'historisation pour positionner les valeurs dans un compteur Histo.
Dernier point, qui marche que depuis 24h, le calcul du cout en €, jour par jour.

Code : Tout sélectionner

-- script domoticz/scripts/lua/script_device_compteurHC-HP.lua
local script_label = "EDF"

-- Initialisation des variables locales
local capteurGlobal = "Compteur_Global_Cumul"
local capteurCptHP = "Compteur_HP"
local capteurCptHC = "Compteur_HC"
local HistoHCHP = "Compteur_Histo"
local euro = "EURO_EDF"

local idxCptHP = otherdevices_idx[capteurCptHP]
local idxCptHC = otherdevices_idx[capteurCptHC]
local idxCptHisto = otherdevices_idx[HistoHCHP]
local idxEuro = otherdevices_idx[euro]
local flagHC = "EDF_HCHP"

local euro_HC = uservariables['Cout_KW_HC']
local euro_HP = uservariables['Cout_KW_HP']

-- Mode debug Oui / Non
local debug = uservariables['DEBUG']




-- Fonction de mise à jour
function update(device, id, power, energy, index)
    print(script_label .. ' Update ' .. device .. ' ID : ' .. id .. ' => power : ' .. power .. ' energy :' .. energy)
    commandArray[index] = {['UpdateDevice'] = id .. "|0|" .. power .. ";" .. energy}
    return
end

commandArray = {} 

if otherdevices["Standbye_Signal"] == "On" then 
    print (script_label .. " : Standbye_Signal configuré, aucun pilotage")
    return commandArray    
end

print(script_label .. ' Start')
print(script_label .. ' Debug : ' .. debug)   
print(script_label .. ' capteurGlobal : ' .. capteurGlobal)


Conso_Instant, Conso_Cumul = otherdevices_svalues[capteurGlobal]:match("([^;]+);([^;]+)")

Conso_Instant = tonumber (Conso_Instant)
    print (script_label .. ' Conso Instant = ' .. Conso_Instant .. "/Watts")
    print (script_label .. ' Conso Cumul = ' .. Conso_Cumul .. "/Watts")
    print (script_label .. ' Conso Cumul/1000 = ' .. Conso_Cumul/1000 .. "/kWh")

-- update(HistoHCHP, idxCptHisto,  0, 0, 1)
-- update(capteurCptHP, 726,  0, 0, 5)
-- update(capteurCptHC, idxCptHC,  0, 0, 5)
-- update(euro, idxEuro, 0, 0, 1)
-- update(euro, 728, 0,0, 5)

if (devicechanged[capteurGlobal]) then
    print (script_label .. ' Il y a eu augmentation de la consommation')
    -- Mise à jour du compteur
    Histo_Instant, Histo_Cumul = otherdevices_svalues[HistoHCHP]:match("([^;]+);([^;]+)")
    print (script_label .. ' Conso Histo Instant = ' .. Histo_Instant .. "/kWh")
    print (script_label .. ' Conso Histo Cumul = ' .. Histo_Cumul .. "/kWh")
    print (script_label .. ' Conso Histo Cumul/1000 = ' .. Histo_Cumul/1000 .. "/kWh")
    

    -- commandArray[capteurCptHP]= tostring(Delta_Conso)
    print (script_label .. ' flagHC = ' .. otherdevices[flagHC])
    
    if (otherdevices[flagHC]=='On') then
        print (script_label .. ' On est en heures creuses')
        Delta_Conso = (Conso_Cumul-Histo_Cumul)
        print (script_label .. ' Delta Conso = ' .. Delta_Conso .. "/Wh")
        print (script_label .. ' Delta Conso = ' .. Delta_Conso/1000 .. "/kWh")
        print (script_label .. ' La conso du kWh HC est de : ' .. euro_HC)
        -- Seul le cumule du compteur nous interesse pour calculer la nouvelle valeur
        conso_Cumul = tonumber(conso_Cumul)
        euro_HCHP = euro_HC
        print(script_label .. ' Compteur cible = HC')
        print(script_label .. ' Valeur capteurCptHC = '..tostring(capteurCptHC))
        print(script_label .. ' Valeur idxCptHC = '..tostring(idxCptHC))
        print(script_label .. ' Valeur consoInstant = '..tostring(Conso_Instant))

        -- Mise à jour du compteur
        consoInstantHC, consoCumuleHC = otherdevices_svalues[capteurCptHC]:match("([^;]+);([^;]+)")
        print(script_label .. ' Valeur consoInstantHC = '..tostring(capteurCptHC))
        print(script_label .. ' Valeur consoCumuleHC = '..tostring(capteurCptHC))
        update(capteurCptHC, idxCptHC, tonumber(Conso_Instant), consoCumuleHC+Delta_Conso, 1)
        
        -- Mise à 0 de la conso intantanee du compteur HP
        consoInstantHP, consoCumuleHP = otherdevices_svalues[capteurCptHP]:match("([^;]+);([^;]+)")
        consoInstantHP = 0
        update(capteurCptHP, idxCptHP, consoInstantHP, consoCumuleHP, 2)

        -- Sauvegarde de la valeur du compteur global pour prochain calcul
        update(HistoHCHP, idxCptHisto,  Conso_Instant, Conso_Cumul, 3)    
        euro_HCHP = euro_HC
    else
        -- Periode heures pleines
        -- Recuperation des valeurs du compteur global
        print (script_label .. ' On est en heures pleines')
        Delta_Conso = (Conso_Cumul-Histo_Cumul)
        print (script_label .. ' Delta Conso = ' .. Delta_Conso .. "/Wh")
        print (script_label .. ' Delta Conso = ' .. Delta_Conso/1000 .. "/kWh")
        print (script_label .. ' La conso du kWh HP est de : ' .. euro_HP)
        -- Seul le cumule du compteur nous interesse pour calculer la nouvelle valeur
        conso_Cumul = tonumber(conso_Cumul)
        euro_HCHP = euro_HP
        print(script_label .. ' Compteur cible = HP')
        print(script_label .. ' Valeur capteurCptHP = '..tostring(capteurCptHP))
        print(script_label .. ' Valeur idxCptHP = '..tostring(idxCptHP))
        print(script_label .. ' Valeur consoInstant = '..tostring(Conso_Instant))

        -- Mise à jour du compteur
        consoInstantHP, consoCumuleHP = otherdevices_svalues[capteurCptHP]:match("([^;]+);([^;]+)")
        update(capteurCptHP, idxCptHP, tonumber(Conso_Instant), consoCumuleHP+Delta_Conso, 1)
        
        -- Mise à 0 de la conso intantanee du compteur HC
        consoInstantHC, consoCumuleHC = otherdevices_svalues[capteurCptHC]:match("([^;]+);([^;]+)")
        consoInstantHC = 0
        update(capteurCptHC, idxCptHC, consoInstantHC, consoCumuleHC, 2)

        -- Sauvegarde de la valeur du compteur global pour prochain calcul
        update(HistoHCHP, idxCptHisto, Conso_Instant, Conso_Cumul, 3)
        euro_HCHP = euro_HP
    end
    print(script_label .. ' Calcul Tarifaire')
    print(script_label .. ' Calcul Tarifaire => Delta_Conso /Wh: ' .. Delta_Conso)
    print(script_label .. ' Calcul Tarifaire => Delta_Conso /kWh: ' .. Delta_Conso/1000)
    print(script_label .. ' Calcul Tarifaire => Tarif kWh : ' .. euro_HCHP)
    print(script_label .. ' Calcul Tarifaire => Cout : ' .. Delta_Conso/1000*euro_HCHP)

    Cout_Instant, Cout_Cumul = otherdevices_svalues[euro]:match("([^;]+);([^;]+)")
    print(script_label .. ' Calcul Tarifaire => Cout_Cumul actuel : ' .. Cout_Cumul)    
    print(script_label .. ' Calcul Tarifaire => Cout_Cumul+Delta_Conso*euro_HCHP : ' .. Cout_Cumul+Delta_Conso/1000*euro_HCHP)    
    update(euro, idxEuro,  Cout_Cumul+ Delta_Conso/1000*euro_HCHP, Cout_Cumul+ Delta_Conso/1000*euro_HCHP, 4)

else
    print (script_label .. " Il n'y a PAS eu augmentation de la consommation")
end


return commandArray 

Je pense réutiliser le debug.

voila pour mes mesures
Mesures.jpg
Mesures.jpg (266.88 Kio) Consulté 9651 fois
Le calcul €
euros.jpg
euros.jpg (122.72 Kio) Consulté 9651 fois
et mes variables
Variables.jpg
Variables.jpg (122.33 Kio) Consulté 9651 fois
Voici un extrait des logs, lorsqu'il y a changement d'état sur le CM180 avec une modification du total de W consommés

Code : Tout sélectionner

2016-10-29 21:38:20.832 LUA: EDF Start
2016-10-29 21:38:20.832 LUA: EDF Debug : 1
2016-10-29 21:38:20.832 LUA: EDF capteurGlobal : Compteur_Global_Cumul
2016-10-29 21:38:20.832 LUA: EDF Conso Instant = 1078/Watts
2016-10-29 21:38:20.832 LUA: EDF Conso Cumul = 6345037.500/Watts
2016-10-29 21:38:20.848 LUA: EDF Conso Cumul/1000 = 6345.0375/kWh
2016-10-29 21:38:20.848 LUA: EDF Il y a eu augmentation de la consommation
2016-10-29 21:38:20.848 LUA: EDF Conso Histo Instant = 1062/kWh
2016-10-29 21:38:20.848 LUA: EDF Conso Histo Cumul = 6345019.500/kWh
2016-10-29 21:38:20.848 LUA: EDF Conso Histo Cumul/1000 = 6345.0195/kWh
2016-10-29 21:38:20.848 LUA: EDF flagHC = Off
2016-10-29 21:38:20.848 LUA: EDF On est en heures pleines
2016-10-29 21:38:20.848 LUA: EDF Delta Conso = 18/Wh
2016-10-29 21:38:20.848 LUA: EDF Delta Conso = 0.018/kWh
2016-10-29 21:38:20.848 LUA: EDF La conso du kWh HP est de : 0.15762
2016-10-29 21:38:20.848 LUA: EDF Compteur cible = HP
2016-10-29 21:38:20.848 LUA: EDF Valeur capteurCptHP = Compteur_HP
2016-10-29 21:38:20.848 LUA: EDF Valeur idxCptHP = 726
2016-10-29 21:38:20.863 LUA: EDF Valeur consoInstant = 1078
2016-10-29 21:38:20.863 LUA: EDF Update Compteur_HP ID : 726 => power : 1078 energy :28385
2016-10-29 21:38:20.863 LUA: EDF Update Compteur_HC ID : 725 => power : 0 energy :19985
2016-10-29 21:38:20.863 LUA: EDF Update Compteur_Histo ID : 724 => power : 1078 energy :6345037.500
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire => Delta_Conso /Wh: 18
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire => Delta_Conso /kWh: 0.018
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire => Tarif kWh : 0.15762
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire => Cout : 0.00283716
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire => Cout_Cumul actuel : 5.61653278
2016-10-29 21:38:20.863 LUA: EDF Calcul Tarifaire => Cout_Cumul+Delta_Conso*euro_HCHP : 5.61936994
2016-10-29 21:38:20.863 LUA: EDF Update EURO_EDF ID : 728 => power : 5.61936994 energy :5.61936994
Amusez-vous bien !
Dernière modification par jfpiat le 29 oct. 2016, 23:05, modifié 1 fois.
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Repartition Consommation HC / HP...

Message par stephdes »

Jfpiat, je pense que tu vas être ma prochaine source d'inspiration !

Merci du partage par contre je ne comprends pas bien le code que tu as collé :?
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
jfpiat
Messages : 10
Inscription : 29 mars 2016, 22:38

Re: Repartition Consommation HC / HP...

Message par jfpiat »

Salut,

lol, c'est corrigé, j'crois que c'est le bon maintenant

jfp
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

Re: Repartition Consommation HC / HP...

Message par Snorky »

Bonjour,

Voici ma version :

Code : Tout sélectionner

-- Version : 20161030_01
-- Author : chandler45 (easydomoticz.com) / Snorky
-- Recuperation releve electricite et dispatch HP/HC

--------------------------------
-- Variable a editer -----------
--------------------------------
local capteurGlobal = 'CompteurEDF' -- Nom device OWL 180
local capteurHP = 'ConsoHP' -- Nom virtual device des HP
local capteurHPIdx = 26 -- IDX virtual device des HP
local capteurHC = 'ConsoHC' -- Nom virtual device des HC
local capteurHCIdx = 25 -- IDX virtual device des HC
local flagHP = 'HP EDF' -- Nom virtual device des HP/HC
--------------------------------
-- Fin des variables a editer --
--------------------------------

-- Fonction de mise à jour
function update(id, power, energy,index)
	commandArray[index] = {['UpdateDevice'] = id .. "|0|" .. power .. ";" .. energy}
	return
end

commandArray = {}

-- On prend en compte a chaque changement de valeur du compteur global
if (devicechanged[flagHP]) then

	-- Recuperation des valeurs du compteur global
	local consoCumule
	local consoInstant
	consoInstant, consoCumule = otherdevices_svalues[capteurGlobal]:match("([^;]+);([^;]+)")
	consoInstant = tonumber(consoInstant)
	consoCumule = tonumber(consoCumule)

	-- Recuperation des valeurs du compteur HP
	local consoCumuleHP
	local consoInstantHP
	consoInstantHP, consoCumuleHP = otherdevices_svalues[capteurHP]:match("([^;]+);([^;]+)")
	consoInstantHP = tonumber(consoInstantHP)
	consoCumuleHP = tonumber(consoCumuleHP)
 
	-- Recuperation des valeurs du compteur HP
	local consoCumuleHC
	local consoInstantHC
	consoInstantHC, consoCumuleHC = otherdevices_svalues[capteurHC]:match("([^;]+);([^;]+)")
	consoInstantHC = tonumber(consoInstantHC)
	consoCumuleHC = tonumber(consoCumuleHC)
  
	-- Calcul de l'ecart entre compteurGlobal et compteurHP+compteurHC
	local consoDelta = consoCumule - consoCumuleHP - consoCumuleHC

	-- Changement HP/HC
	if (otherdevices[flagHP] == 'On') then
		-- Mise à jour du compteur HC
		update(capteurHCIdx, 0, consoCumuleHC+consoDelta,1)

	else     
		-- Mise à jour du compteur HP
		update(capteurHPIdx, 0, consoCumuleHP+consoDelta,2)

	end

end

return commandArray
Je suis reparti du code de chandler45 mais j'ai simplifié le principe pour moi.

- Un device global : OWL 180
- Un device virtuel de type Electric pour les HP
- Un device virtuel de type Electric pour les HC
- Un device vituel interrupteur HP (avec planning je le passe à ON/OFF en fonction de mes heures)

La différence majeure avec le script initial est que je ne stocke pas la dernière valeur de conso globale.

1 - Récupération de la conso globale (c'est la consommation actuelle)
2 - Récupération de la conso HP (c'est la dernière conso stockée lorsque je suis passé en HP)
3 - Récupération de la conso HC (c'est la dernière conso stockée lorsque je suis passé en HC)
4 - Calcul du delta avec consoGlobale - consoHP - consoHC

Exemple :
23h30 : ConsoGlobale=100 / ConsoHP=70 / ConsoHC=30
6h29 : ConsoGlobale=130 / ConsoHP=70 / ConsoHC=30
6h30 : Mon interrupteur passe en HP donc je sais que j'étais en HC juste avant
ConsoGlobale=130 / ConsoHP=70 / ConsoHC=60


Point à améliorer :
- Pas de gestion de la conso instantanée (pas besoin dans mon cas) mais il suffit de passer le script lua en time et de modifier l'update (0 avec consoInstant)

Je suis en phase de test donc wait and see
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Repartition Consommation HC / HP...

Message par stephdes »

jfpiat a écrit :Salut,

lol, c'est corrigé, j'crois que c'est le bon maintenant

jfp
Merci ! ;)

J'ai un soucis avec ton script si tu peux m'aider stp.

Alors, j'ai substitué ta variable "local capteurGlobal = "Compteur_Global_Cumul"" par mon compteur : "local capteurGlobal = "Compteur EDF""

J'ai créé les compteurs : Compteur HC, Compteur HP, Compteur Histo, Euro EDF

Puis les variables utilisateurs : COUT...HC, COUT...HP et EDF dernier relevé.

Dans les log j'ai une erreur : script_device_compteurHC-HP.lua:61: attempt to index field '?' (a nil value)
ce qui correspond à Histo_Instant, Histo_Cumul = otherdevices_svalues[HistoHCHP]:match("([^;]+);([^;]+)")

Image

Code : Tout sélectionner

 2016-10-30 16:01:27.926 LUA: EDF Start
2016-10-30 16:01:27.926 LUA: EDF Debug : 1
2016-10-30 16:01:27.927 LUA: EDF capteurGlobal : Compteur EDF
2016-10-30 16:01:27.927 LUA: EDF Conso Instant = 2929/Watts
2016-10-30 16:01:27.927 LUA: EDF Conso Cumul = 122002.805/Watts
2016-10-30 16:01:27.927 LUA: EDF Conso Cumul/1000 = 122.002805/kWh
2016-10-30 16:01:27.927 LUA: EDF Il y a eu augmentation de la consommation
2016-10-30 16:01:27.927 Error: EventSystem: in C:\Program Files (x86)\Domoticz\scripts\lua\script_device_compteurHC-HP.lua: ...86)\Domoticz\scripts\lua\script_device_compteurHC-HP.lua:61: attempt to index field '?' (a nil value) 

Merci !
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
jfpiat
Messages : 10
Inscription : 29 mars 2016, 22:38

Re: Repartition Consommation HC / HP...

Message par jfpiat »

Bonsoir,

Ce problème doit venir de l'initialisation de tes compteurs
Pour l'heure, il n'y a pas de valeurs, donc, cela génère une erreur quand le script tente de les lire

Il faut les initialiser
un par un en retirant les commentaires des lignes suivantes

-- update(HistoHCHP, idxCptHisto, 0, 0, 1)
-- update(capteurCptHP, 726, 0, 0, 5)
-- update(capteurCptHC, idxCptHC, 0, 0, 5)
-- update(euro, idxEuro, 0, 0, 1)
-- update(euro, 728, 0,0, 5)

Après les 5 initialisations, ça devrait fonctionner. Dis moi si il y a encore un problème.

jf
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Repartition Consommation HC / HP...

Message par stephdes »

jfpiat a écrit :Bonsoir,

Ce problème doit venir de l'initialisation de tes compteurs
Pour l'heure, il n'y a pas de valeurs, donc, cela génère une erreur quand le script tente de les lire

Il faut les initialiser
un par un en retirant les commentaires des lignes suivantes

-- update(HistoHCHP, idxCptHisto, 0, 0, 1)
-- update(capteurCptHP, 726, 0, 0, 5)
-- update(capteurCptHC, idxCptHC, 0, 0, 5)
-- update(euro, idxEuro, 0, 0, 1)
-- update(euro, 728, 0,0, 5)

Après les 5 initialisations, ça devrait fonctionner. Dis moi si il y a encore un problème.

jf

Bonjour JF et merci de ton aide.

Je dois mal m'y prendre car ça ne fonctionne pas. J'ai essayé en supprimant les lignes une par une et également en mettant :

-- update(HistoHCHP, idxCptHisto)
-- update(capteurCptHP)
-- update(capteurCptHC, idxCptHC)
-- update(euro, idxEuro)
-- update(euro)

Mais vu que je suis boulet, je n'ai peut être pas compris :oops:
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

Re: Repartition Consommation HC / HP...

Message par thier »

Enlever les commentaires ne veut pas dire supprimer la ligne mais enlever les "--" qui sont au début de chaque ligne pour qu'elle s'exécute. Ensuite tu recommentes.
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
Répondre