Pb mise à jour COUNTER

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
limonade67
Messages : 36
Inscription : 29 nov. 2016, 11:23

Pb mise à jour COUNTER

Message par limonade67 »

Bonjour,

J'utilise un script déposé dans cette rubrique pour comptabiliser le temps de fonctionnement d'une chaudière Fuel.
J'ai modifié les script pour connaitre l'utilisation de Fuel pour l'eau chaude ECS.
Lorsque j'ajoute la ligne commandArray['UpdateDevice'] = counter2 .. '|0|' .. tostring(Litre_Compteur_ECS)
Counter n'est plus mis à jour.
Je n'y connais pas grand chose en LUA.

Voici le Script complet :

Code : Tout sélectionner

-- Ce script permet de remonter une estimation de la consommation en fioul de la chaudière dans un capteur virtuel de type "Counter Incremental".
-- A enregistrer en script_time.lua
--Créer une uservariable. Réglage /plus d'option / Variable utilisateur. Nommé "Total_compteur"

--------------------------------
------ Variables à éditer ------
--------------------------------
local switch = 'Chaudière' -- Nom de l'interrupteur virtuel Chauffage dans Domoticz
local switch2 = 'Pompe_ECS' -- Nom de l'interrupteur virtuel Chauffage dans Domoticz
local counter = 34 -- Numéro idx du Counter Incremental dans Domoticz
local counter2 = 121 -- Numéro idx du Counter Incremental dans Domoticz
local current_date = (os.date("30/12/2016")) -- Date courante
local current_heure = (os.date("17:57")) -- Heure courante
--------------------------------
-- Fin des variables à éditer --
--------------------------------

--------------------------------
---Paramètres--
----------------------------------
Debit_gicleur = 0.60 --Gallon/heure
Conv_Gallon = 3.78541178 --Litres
Debit_gicleur_l_min = Debit_gicleur * Conv_Gallon / 60 -- En litres/min
Var_ajustement = 1 --Ajustement entre circulateur ON et chaudière ON

-------------------
-- Fonction time --
-------------------
time = os.date("*t")

function timedifference(d)
s = otherdevices_lastupdate[d]
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end

------------------- --------------------
-- Fonction arrondir à deux décimales --
------------------- --------------------
-- Le chiffre"x" (dec or x) correspond au nombre de décimales à prendre en compte dans le resultat
function arrondir(num, dec)
if num == 0 then
return 0
else
local mult = 10^(dec or 2)
return math.floor(num * mult + 0.5) / mult
end
end

commandArray = {}

-----------------------------------------------------------------------------------------------------
--------------------Calcul du temps de fonctionnement de la chaudière -------------------------------
-----------------------------------------------------------------------------------------------------

-- Si chauffage ON incrémentation de la variable Domoticz "Total_compteur" --
if (otherdevices[switch]=='On') then
    commandArray['Variable:Total_compteur']= tostring(uservariables["Total_compteur"] +1)
    if (otherdevices[switch2]=='On') then 
        commandArray['Variable:Total_compteur_ECS']= tostring(uservariables["Total_compteur_ECS"] +1)    
    end    
end

-- Envoi de la varaible valeur Total_compteur dans le Custom Counter Valeur_Compteur en min--
Valeur_Compteur = tostring(uservariables["Total_compteur"])
Valeur_Compteur_ECS = tostring(uservariables["Total_compteur_ECS"])
-- Transforme Valeur_compteur en litre pour gicleur 0.6 gallon/heure
Litre_Compteur = (Valeur_Compteur )* (Debit_gicleur_l_min)*(Var_ajustement)
Litre_Compteur_ECS = (Valeur_Compteur_ECS )* (Debit_gicleur_l_min)*(Var_ajustement)

-- Envoi de la valeur dans le compteur "counter" --
commandArray['UpdateDevice'] = counter .. '|0|' .. tostring(Litre_Compteur)
-- commandArray['UpdateDevice'] = counter2 .. '|0|' .. tostring(Litre_Compteur_ECS)

-- Envoi des informations dans le LOG si chauffage ON --
if (otherdevices[switch]=='On') then
print("")
print("Cumul du temps de fonctionnement chaudière "..Valeur_Compteur.." Minutes".." // "..math.floor((Valeur_Compteur/60)).. " Heures")
print("")
print("Cumul Litres fioul "..Litre_Compteur.." Litres")
print("")

end
return commandArray


Quelqu’un a une idée pourquoi ça ne fonctionne pas ?
Par avance merci.
RFXCOM - RFXtrx433 USB 433.92MHz Transceiver
Aeotec Zwave+ Usb
Synology110J
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Pb mise à jour COUNTER

Message par aleph0 »

Code : Tout sélectionner

commandArray['UpdateDevice'] = counter .. '|0|' .. tostring(Litre_Compteur)
-- commandArray['UpdateDevice'] = counter2 .. '|0|' .. tostring(Litre_Compteur_ECS)
Si tu utilises cette syntaxe, tu ne peut avoir qu'un seul commandArray['UpdateDevice'] par script, et c'est le dernier qui parle qui a raison. Pour en avoir plusieurs, utilises plutôt la syntaxe suivante :

Code : Tout sélectionner

commandArray[1] = {['UpdateDevice'] = counter]..'|0|'..tostring(Litre_Compteur)}
commandArray[2] = {['UpdateDevice'] = counter2]..'|0|'..tostring(Litre_Compteur_ECS)}
Y'a plein d'autre possiblités d'optimisations dispo sur le forum, regarde par exemple là : viewtopic.php?f=17&t=3940
limonade67
Messages : 36
Inscription : 29 nov. 2016, 11:23

Re: Pb mise à jour COUNTER

Message par limonade67 »

Merci pour ton aide.
Aucun des capteurs n'est maintenant mis à jour.
N'y aurait il pas un problème de syntaxe ?
Il doit manquer un crochet "[" non ?

Code : Tout sélectionner

commandArray[1] = {['UpdateDevice'] = counter]..'|0|'..tostring(Litre_Compteur)}
commandArray[2] = {['UpdateDevice'] = counter2]..'|0|'..tostring(Litre_Compteur_ECS)}
RFXCOM - RFXtrx433 USB 433.92MHz Transceiver
Aeotec Zwave+ Usb
Synology110J
limonade67
Messages : 36
Inscription : 29 nov. 2016, 11:23

Re: Pb mise à jour COUNTER

Message par limonade67 »

Voici la bonne syntaxe.

Code : Tout sélectionner

commandArray[1] = {['UpdateDevice'] = counter..'|0|'..tostring(Litre_Compteur)}
commandArray[2] = {['UpdateDevice'] = counterECS..'|0|'..tostring(Litre_Compteur_ECS)}
Merci pour ton aide.
RFXCOM - RFXtrx433 USB 433.92MHz Transceiver
Aeotec Zwave+ Usb
Synology110J
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Pb mise à jour COUNTER

Message par aleph0 »

Oui, dsl pour la coquille !
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

Re: Pb mise à jour COUNTER

Message par thier »

Une autre syntaxe que j'utilise, au lieu de commandArray[1], commandArray[2] etc, j'utilise commandArray[# commandArray +1]. Comme ça le compteur commandArray s'incrémente tous seul. Pas la peine de faire des corrections si on ajoute ou supprime une ligne contenant un commandeArray[nb].
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.
limonade67
Messages : 36
Inscription : 29 nov. 2016, 11:23

Re: Pb mise à jour COUNTER

Message par limonade67 »

Dans le paragraphe plus haut de mon script :

Code : Tout sélectionner

-----------------------------------------------------------------------------------------------------
--------------------Calcul du temps de fonctionnement de la chaudière -------------------------------
-----------------------------------------------------------------------------------------------------

-- Si chauffage ON incrémentation de la variable Domoticz "Total_compteur" --
if (otherdevices[switch]=='On') then
    commandArray['Variable:Total_compteur']= tostring(uservariables["Total_compteur"] +1)
    if (otherdevices[switch2]=='On') then 
        commandArray['Variable:Total_compteur_ECS']= tostring(uservariables["Total_compteur_ECS"] +1)    
    end    
end
Je dois également mettre des incrémentation alors ? non ? :?:
RFXCOM - RFXtrx433 USB 433.92MHz Transceiver
Aeotec Zwave+ Usb
Synology110J
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Pb mise à jour COUNTER

Message par aleph0 »

C'est pas obligé, mais c'est une bonne pratique d'en mettre systématiquement : Comme ça, on ne se pose plus de questions ! Je te conseillerai même de suivre le conseil de thier, il est excellent :)

La règle c'est qu'il ne doit pas y avoir 2x le même index de commandarray[index] dans le script, sinon seul le dernier est pris en compte
TheFFF
Messages : 12
Inscription : 01 mai 2017, 15:13

Re: Pb mise à jour COUNTER

Message par TheFFF »

Bonjour

Je me permet de venir demander de l'aide à la suite pour ce script.

Je tente de faire remonter dans Domoticz (que je pratique depuis peu) le temps de fonctionnement de plusieurs appareils.

J'ai donc adapter les scripts trouvés sur ce super forum. Avec un seul équipement, pas de soucis, le compteur s’incrémente bien.
C'est avec 2 périphériques que je bloque. Même en étudiant tout ce post, je ne comprends pas ce que je fait de mal. Pouvez vous m'éclairer ?

Code : Tout sélectionner

 --------------------------------
 ------ Variables à éditer ------
 --------------------------------
 local switch = 'Léo Playstation 4'      -- Nom de l'interrupteur virtuel dans Domoticz
 local counter = 59         -- Numéro idx du Counter Incremental dans Domoticz
 local switch2 = 'Léo Téléphone'      -- Nom de l'interrupteur virtuel dans Domoticz
 local counter2 = 56         -- Numéro idx du Counter Incremental dans Domoticz
 local current_date = (os.date("01/01/2017"))      -- Date courante
 local current_heure = (os.date("00:01"))         -- Heure courante
 --------------------------------
 -- Fin des variables à éditer --
 --------------------------------


 -------------------
 -- Fonction time --
 -------------------
 time = os.date("*t")  

function timedifference(d)
   s = otherdevices_lastupdate[d]
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

 ------------------- --------------------
 -- Fonction arrondir à deux décimales --
 ------------------- --------------------
  -- Le chiffre"x" (dec or x) correspond au nombre de décimales à prendre en compte dans le resultat
   function arrondir(num, dec)
      if num == 0 then
      return 0
         else
            local mult = 10^(dec or 2)
            return math.floor(num * mult + 0.5) / mult
       end
   end

commandArray = {}

-----------------------------------------------------------------------------------------------------
--------------------Calcul du temps de fonctionnement de la PS4 de Léo -------------------------------
-----------------------------------------------------------------------------------------------------

   -- Si chauffage ON incrémentation de la variable Domoticz "Total_PS4_Léo" --
   if (otherdevices[switch]=='On') then
   commandArray['Variable:Total_PS4_Léo']= tostring(uservariables["Total_PS4_Léo"] +1)
   if (otherdevices[switch2]=='On') then
   commandArray['Variable:Total_Téléphone_Léo']= tostring(uservariables["Total_Téléphone_Léo"] +1)
   end
   
   -- Envoi de la variable valeur Total_PS4_Léo dans le Custom Counter Valeur_Compteur --
   Valeur_Compteur_PS4Léo = tostring(uservariables["Total_PS4_Léo"])
   Valeur_Compteur_TéléphoneLéo = tostring(uservariables["Total_Téléphone_Léo"])

   
   -- Envoi de la valeur dans le compteur "counter" --
   commandArray[1] = {['UpdateDevice'] = counter..'|0|'..tostring(Valeur_Compteur_PS4Léo)
   commandArray[2] = {['UpdateDevice'] = counter2..'|0|'..tostring(Valeur_Compteur_TéléphoneLéo)
   
   
   -- Envoi des informations dans le LOG si PS4 ON --   
   if (otherdevices[switch]=='On') then
      print("")
      print("Cumul du temps de fonctionnement de la PS4 de Léo "..Valeur_Compteur.." Minutes".."  //  "..math.floor((Valeur_Compteur/60)).. " Heures")
      print("")
   end  
return commandArray
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Pb mise à jour COUNTER

Message par vil1driver »

Salut,

à priori il manque un end

et il est important de comprendre que rien n'est effectué avant la toute fin du script, donc mettre à jour une variable et penser pouvoir l'utiliser directement est une erreur..
il te faut donc faire le calcule et n'utiliser que lui
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Répondre