Page 1 sur 1

Débutant aide sur LUA

Publié : 30 nov. 2022, 11:03
par marcus_54
Bonjour,

J'ai un script qui tourne bien créé par papoo en 2016 qui envoie des données dans le cloud.
j'ai modifié un capteur du coup la valeur s'affiche mal

C'est la puissance consommée. sur Domoticz dans le widget elle s'affiche 880 W
dans les index de Domoticz

Code : Tout sélectionner

Teleinfo kWh Total	880.000;46658584.000	0/880.000;46658584.000
Je récupère sur mon téléphone la valeur 880.000, le .000 gène la lisibilité de l'information.
Comment supprimer ce .000 ?

voici la ligne ou est inséré cette valeur :

Code : Tout sélectionner

les_devices[#les_devices+1] = {device="Teleinfo kWh Total", field=8, nom="puissance", canal=""}




Au cas ou le code entier

Code : Tout sélectionner

--[[script_time_export_ThingSpeak.lua
auteur : papoo
MAJ: 26/11/2017
date : 18/05/2016
Principe :
exporter les données de compteurs, Températures, etc.. sur le site thingspeak.com
limite de "field" par "channel" = 8
Le script est lu toutes les minutes mais n'exporte les données que toutes les 4 minutes (temps modifiable ligne 40)
http://easydomoticz.com/forum/viewtopic.php?f=17&t=1925&p=25015
http://pon.fr/exporter-des-donnees-vers-le-site-thingspeak/
]]--

--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------

local nom_script = "export ThingSpeak"
local version = "1.2"
local debugging = false     -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local url_thingspeak = 'https://api.thingspeak.com/'
local API_key = 'xxxxxxxxxxxxxxxxxxx' -- creer une variable de type chaine contenant votre code API Write KEY ThingSpeak
-- si vous souhaitez remonter les valeurs d'un device qui en comporte plusieurs (ex: température et hygrometrie extérieure)
-- renseigner le nom de la valeur à remonter (à partir de la deuxieme valeur) ainsi que le numero d'ordre dans canal (voir exemple ci dessous field 7 )
local les_devices = {}; -- pas plus de 8 devices
-- 1er compteur : device ="nom du device 1", field=field ThingSpeak associé, nom=nom du device si canal >1, canal=si valeur multiple n° du canal à utiliser
les_devices[#les_devices+1] = {device="t Exterieure", field=1, nom="", canal=""}
-- 2eme compteur : device ="nom du device 2", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="t Salon", field=2, nom="", canal=""}
-- 3eme compteur : device ="nom du device 3", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="Barometre Veranda", field=3, nom="temp", canal="1"}
les_devices[#les_devices+1] = {device="Solaire Production", field=4, nom="P Solaire", canal=""}
les_devices[#les_devices+1] = {device="t Cuve chaude", field=5, nom="EauChaude", canal=""}
les_devices[#les_devices+1] = {device="Barometre", field=6, nom="Pression", canal="2"}
les_devices[#les_devices+1] = {device="t Ch coucher", field=7, nom="", canal=""}
les_devices[#les_devices+1] = {device="Teleinfo kWh Total", field=8, nom="puissance", canal=""}

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local fields =""
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then
      if s ~= nil then
        print (s)
      else
      print ("aucune valeur affichable")
      end
    end
end   -- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
--------------------------------------------
function url_encode(str) -- encode la chaine str pour la passer dans une url
   if (str) then
   str = string.gsub (str, "\n", "\r\n")
   str = string.gsub (str, "([^%w ])",
   function (c) return string.format ("%%%02X", string.byte(c)) end)
   str = string.gsub (str, " ", "+")
   end
   return str
end
------------------------------------------
function sans_accent(str) -- supprime les accents de la chaîne str
    if (str) then
   str = string.gsub (str,"Ç", "C")
   str = string.gsub (str,"ç", "c")
   str = string.gsub (str,"[-èéêë']+", "e")
   str = string.gsub (str,"[-ÈÉÊË']+", "E")
   str = string.gsub (str,"[-àáâãäå']+", "a")
   str = string.gsub (str,"[-@ÀÁÂÃÄÅ']+", "A")
   str = string.gsub (str,"[-ìíîï']+", "i")
   str = string.gsub (str,"[-ÌÍÎÏ']+", "I")
   str = string.gsub (str,"[-ðòóôõö']+", "o")
   str = string.gsub (str,"[-ÒÓÔÕÖ']+", "O")
   str = string.gsub (str,"[-ùúûü']+", "u")
   str = string.gsub (str,"[-ÙÚÛÜ']+", "U")
   str = string.gsub (str,"[-ýÿ']+", "y")
   str = string.gsub (str,"Ý", "Y")
     end
    return (str)
end
--------------------------------------------
function split(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end -- usage : valeurs = split(variable,";")
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

commandArray = {}
time=os.date("*t")

if ((time.min-1) % 2) == 0 then-- export des données toutes les 1 minutes en commençant par xx:01
        voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
				--local API_key = uservariables[api_thingspeak]          
        voir_les_logs("--- --- --- Export vers ThingSpeak  : "..time.hour.. ":" ..time.min,debugging)

        for i,d in ipairs(les_devices) do
    				v=otherdevices[d.device]
   					c=tonumber(d.canal)
          	voir_les_logs("--- --- --- ".. sans_accent(d.device) .." = "..(v or "nil"),debugging)
          	voir_les_logs("--- --- --- canal = "..(c or "nil"),debugging)
          	if v~= nil then
          			v,nbCommas=string.gsub(v,";",";") 
          	end-- vérification de la présence d'un ou plusieurs point virgule => valeurs multiples
      			if nbCommas >= 1 and c ~= nil then
         				voir_les_logs("--- --- --- valeurs multiples dans ".. sans_accent(d.device) .." = ".. v,debugging)
         				voir_les_logs("--- --- ---  Nb de point virgule = "..(nbCommas or "nil"),debugging)
         				local valeurs = split(v,";")
         				voir_les_logs("--- --- ---  valeur 1 = "..(valeurs[1] or "nil"),debugging)
         				voir_les_logs("--- --- ---  valeur 2 = "..(valeurs[2] or "nil"),debugging)
         				voir_les_logs("--- --- ---  valeur 3 = "..(valeurs[3] or "nil"),debugging)
         				voir_les_logs("--- --- ---  valeur 4 = "..(valeurs[4] or "nil"),debugging)
         				voir_les_logs("--- --- ---  valeur 5 = "..(valeurs[5] or "nil"),debugging)
       					--fields = fields .. '{'.. sans_accent(d.nom) .. ':' .. valeurs[c] .. '},'
       					fields = fields .. '&field' .. i ..'=' .. valeurs[c]
      			elseif v ~= nil then
    						--fields = fields .. '{'.. sans_accent(d.device) .. ':' .. v .. '},'
    						fields = fields .. '&field'.. i ..'=' .. v
    			end
    		end
        voir_les_logs("--- --- --- ".. url_thingspeak ..'update?key=' .. API_key .. fields ,debugging)
   		--os.execute('curl -m5 "'.. url_thingspeak ..'update?key=' .. API_key .. fields)
   		commandArray[1]={['OpenURL']=url_thingspeak ..'update?key=' .. API_key .. fields }  
       	voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
end -- if time
-- ============================================================================
return commandArray   

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 12:42
par Keros
Tu peux essayer cette fonction pour arrondir un nombre :

Code : Tout sélectionner

 function round(number)
      if (number - (number % 0.1)) - (number - (number % 1)) < 0.5 then
        number = number - (number % 1)
      else
        number = (number - (number % 1)) + 1
      end
     return number
    end

print(round(3.1))
print(round(math.pi))
print(round(42))
print(round(4.5))
print(round(4.6))
Le résultat est 3, 3, 42, 5, 5.

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 13:22
par marcus_54
la ou j'ai un doute
La valeur de ce type de capteur, c'est une valeur numérique ? un long ? Ou c'est une chaîne de caractère ?
Si c'est une chaîne, le round ne fonctionne pas ?

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 18:44
par Keros
Si c'est une chaine de caractère, tu peux essayer de la convertir en nombre avec tonumber().
Sinon, il faut enlever les 4 derniers caractères de ta chaine.

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 19:15
par marcus_54
C'est quoi la syntaxe pour enlever les 4 derniers chr ?

l'autre méthode j'ai un bug
attempt to perform arithmetic on a nil value(local 'number')

Code : Tout sélectionner

cap={device="Teleinfo kWh Total", field=8, nom="puissance", canal=""}
capn=tonumber(cap)
capn=round(capn,0)
cap=tostring(capn)
les_devices[#les_devices+1] =cap
---------------- Fonctions -----------------

function round(number)
      if (number - (number % 0.1)) - (number - (number % 1)) < 0.5 then
        number = number - (number % 1)
      else
        number = (number - (number % 1)) + 1
      end
     return number
end

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 19:28
par Keros
As-tu analysé le "bug" ?

La ligne d'erreur indique que le script essaye de faire une opération sur une valeur vide (nil value).

Tu es sûr que capn à bien une valeur avant de l'entrer dans la fonction ?

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 19:30
par marcus_54
j'en sais rien :? je suis complètement débutant sur le truc la...

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 19:33
par Keros
Je t'invite à regarder ma présentation (lien en signature), j'y ai écrit des petits guides dont un concernant le débogage.

Re: Débutant aide sur LUA

Publié : 30 nov. 2022, 19:36
par marcus_54
merci.
je laisse tomber, je n'ai pas le temps de me mettre dans un nouveau langage de programmation avec les subtilités qu'ajoute la gestion des variables de Domoticz.