Page 3 sur 3

Re: Lua : Exporter des données vers le site ThingSpeak

Publié : 21 janv. 2020, 10:57
par Fab59
Alors grand merci je viens de comprendre encore une chose de plus,

J'ai testé le script originel de papoo s'exécute bien, par contre rien n'arrive sur thingspeak, d'ou le pb peut-il venir ?

Code : Tout sélectionner

 2020-01-22 08:54:00.323 Status: LUA: =========== export ThingSpeak (v1.2) ===========
2020-01-22 08:54:00.324 Status: LUA: --- --- --- Export vers ThingSpeak : 8:54
2020-01-22 08:54:00.324 Status: LUA: --- --- --- R001_Poids_de_la_ruche = 51186.3984
2020-01-22 08:54:00.324 Status: LUA: --- --- --- canal = nil
2020-01-22 08:54:00.324 Status: LUA: --- --- --- R001_TC_loadcell = -1.6
2020-01-22 08:54:00.324 Status: LUA: --- --- --- canal = nil
2020-01-22 08:54:00.325 Status: LUA: --- --- --- R001_Variation_poids = 3.5000
2020-01-22 08:54:00.325 Status: LUA: --- --- --- canal = nil
2020-01-22 08:54:00.325 Status: LUA: --- --- --- R001_TC_interieure_DS18B20 = -0.1
2020-01-22 08:54:00.325 Status: LUA: --- --- --- canal = nil
2020-01-22 08:54:00.325 Status: LUA: --- --- --- https://api.thingspeak.com/update?key=ELRZxxxxxxxxDEI2{R001_Poids_de_la_ruche:51186.3984},{R001_TC_loadcell:-1.6},{R001_Variation_poids:3.5000},{R001_TC_interieure_DS18B20:-0.1},
2020-01-22 08:54:00.337 Status: LUA: ========= Fin export ThingSpeak (v1.2) ========= 
Merci encore,

Re: Lua : Exporter des données vers le site ThingSpeak

Publié : 23 janv. 2020, 10:32
par Fab59
Hello,
même si je n'ai pas les prérequis cognitifs en programmation (c'est à dire un niveau proche du néant), je suis tenace et il faut que je comprenne le problème, de plus ça m'arrangerai bien de bénéficier de l'enregistrement des données sur thingspeak, et de l’analyse Matlab,

Thingspeak attend un envoi sur ce format :

Code : Tout sélectionner

https://api.thingspeak.com/update?api_key=ELRZxxxxxxxxDEI2&field1=0
le script de papoo donne dans les logs domoticz :

Code : Tout sélectionner

 https://api.thingspeak.com/update?key=ELRZxxxxxxxxDEI2{R001_Poids_de_la_ruche:51186.3984},{R001_TC_loadcell:-1.6},{R001_Variation_poids:3.5000},{R001_TC_interieure_DS18B20:-0.1},
déjà je remarque une différence au niveau de la présentation de l'api : "update?key=" dans le script de papoo, et "update?api_key=" attendu par thingspeak, et ensuite le format de présentation des valeurs ne correspond pas a ce qu'attend thingspeak

De manière empirique, lorsque j'envoie, sur un navigateur, la requette suivante, ça passe dans thingspeak :

Code : Tout sélectionner

https://api.thingspeak.com/update?api_key=ELRZxxxxxxxxDEI2&field1=51169.5000&field2=1.5&field3=1.5000&field4=3.1&field5=44
J'ai l'impression que marcus est passé par ce cheminement de pensée, quand je vois son commentaire :
{Temp Exterieure:18.4} Est ce que ce n'est pas plutôt &field1=18.8
j'ai aussi tester l'envoi de donnée http via domoticz et ça passe aussi, par contre on ne peut rentrer qu'une adresse en paramètre global, donc ça n'a que peu d'utilité ce service avec thingspeak,

Image

Est ce que quelqu'un peut m'expliquer rapidement ces différences, et m'orienter pour régler mon problème ?

Comme je n'y connais rien, ne serait-ce pas un truc tout con comme le format d'encodage du fichier ?

Re: Lua : Exporter des données vers le site ThingSpeak

Publié : 24 janv. 2020, 09:21
par Fab59
Hello,
ça fonctionne avec les modifications de marcus,

le code :

Code : Tout sélectionner

--[[script_time_export_ThingSpeak.lua
auteur : papoo
MAJ: 28/05/2018
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 debugging = true  	-- 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_thingspeak = 'api_thingspeak' -- 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="R001_Poids_de_la_ruche", field=1, nom="", canal=""}
-- 2eme compteur : device ="nom du device 2", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="R001_TC_loadcell", field=2, nom="", canal=""}
-- 3eme compteur : device ="nom du device 3", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="R001_Variation_poids", field=3, nom="", canal=""}
les_devices[#les_devices+1] = {device="R001_TC_intérieure_DS18B20", field=4, nom="", canal=""}
les_devices[#les_devices+1] = {device="Hr_Rucher", field=5, nom="TC_Rucher", canal="2"}
--les_devices[#les_devices+1] = {device="Compteur Technique", field=6, nom="", canal=""}
--les_devices[#les_devices+1] = {device="Temperature exterieure", field=7, nom="Humidité extérieure", canal="2"}

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local nom_script = "export ThingSpeak"
local version = "1.2"
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) % 1) == 0 then-- export des données toutes les 5 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)
      -- 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)
	commandArray[1]={['OpenURL']=url_thingspeak ..'update?key=' .. API_key .. fields } 
		 voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
end -- if time
-- ============================================================================
return commandArray	
les logs, cette fois thingspeak repond :

Code : Tout sélectionner

 2020-01-24 09:18:00.295 Status: LUA: --- --- --- Export vers ThingSpeak : 9:18
2020-01-24 09:18:00.295 Status: LUA: --- --- --- R001_Poids_de_la_ruche = 51163.0000
2020-01-24 09:18:00.295 Status: LUA: --- --- --- canal = nil
2020-01-24 09:18:00.295 Status: LUA: --- --- --- R001_TC_loadcell = 125.4
2020-01-24 09:18:00.295 Status: LUA: --- --- --- canal = nil
2020-01-24 09:18:00.295 Status: LUA: --- --- --- R001_Variation_poids = -0.3000
2020-01-24 09:18:00.295 Status: LUA: --- --- --- canal = nil
2020-01-24 09:18:00.296 Status: LUA: --- --- --- R001_TC_interieure_DS18B20 = 2.5
2020-01-24 09:18:00.296 Status: LUA: --- --- --- canal = nil
2020-01-24 09:18:00.296 Status: LUA: --- --- --- Hr_Rucher = 16.9;47;1
2020-01-24 09:18:00.296 Status: LUA: --- --- --- canal = 2
2020-01-24 09:18:00.296 Status: LUA: --- --- --- valeurs multiples dans Hr_Rucher = 16.9;47;1
2020-01-24 09:18:00.296 Status: LUA: --- --- --- Nb de point virgule = 2
2020-01-24 09:18:00.296 Status: LUA: --- --- --- valeur 1 = 16.9
2020-01-24 09:18:00.296 Status: LUA: --- --- --- valeur 2 = 47
2020-01-24 09:18:00.296 Status: LUA: --- --- --- valeur 3 = 1
2020-01-24 09:18:00.296 Status: LUA: --- --- --- valeur 4 = nil
2020-01-24 09:18:00.296 Status: LUA: --- --- --- https://api.thingspeak.com/update?key=ELRZxxxxxxxxQDEI2&field1=51163.0000&field2=125.4&field3=-0.3000&field4=2.5&field5=47
2020-01-24 09:18:00.296 Status: LUA: ========= Fin export ThingSpeak (v1.2) =========
2020-01-24 09:18:00.296 Status: EventSystem: Fetching URL https://api.thingspeak.com/update?key=ELRZxxxxxxxxQDEI2&field1=51163.0000&field2=125.4&field3=-0.3000&field4=2.5&field5=47 after 0.2 seconds...
2020-01-24 09:18:00.297 Status: EventSystem: Script event triggered: /home/pi/domoticz/scripts/lua/script_time_R001.lua 
Il me reste encore quelques questionnement sur les canaux multiples et sur la périodicité d'envoi (en l'état ça li et envoie les données chaque minutes)

Merci encore pour ce super script,