Page 2 sur 3

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

Publié : 28 mai 2018, 21:43
par papoo
la version 1.2 est disponible, j'ai edité le code sur le premier post
en espérant que cela réponde à ta problématique.
2018-05-28 21_41_20-Domoticz.png
2018-05-28 21_41_20-Domoticz.png (33.74 Kio) Consulté 6700 fois

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

Publié : 29 mai 2018, 09:42
par marcus_54
Merci Papoo,

Effectivement ça extrait bien les bons champs.
Mais il reste des problèmes..

API_key

Code : Tout sélectionner

local api_thingspeak = 'xxxxxxxxxxxxxxxx' -- creer une variable de type chaine contenant votre code API Write KEY ThingSpeak
...
local API_key = uservariables[api_thingspeak]


donne
Error: EventSystem: in export_ThingSpeak: [string "--[[script_time_export_ThingSpeak.lua..."]:126: attempt to concatenate local 'API_key' (a nil value)


j'ai remplacé par

Code : Tout sélectionner

local API_key = 'xxxxxxxxxxxxxxxx' -- creer une variable de type chaine contenant votre code API Write KEY ThingSpeak
...
--local API_key = uservariables[api_thingspeak]


C'a c'est réglé.
dans débug j'ai les bonnes valeurs dans le log mais thinkspeak ne les prend pas :

l'envoi de l'ancien scipt :

Code : Tout sélectionner

https://api.thingspeak.com/update?key=xxxxxxxxxxxxxxxx&field1=18.8&field2=22.7&field3=28.9&field4=386 ;139140&field5=5067&field6=25.3;1016.1;2;668.32&field7=21.3&field8=22988228;0;0;0;360;0
le nouveau scipt :

Code : Tout sélectionner

https://api.thingspeak.com/update?key=xxxxxxxxxxxxxxxx{Temp Exterieure:18.4},{Temp Salon:22.7},{Temp veranda haut:28.9},{Solaire Production:199 ;139210},{Luminosite:2644},{Pression:1016.6},{Temp Chambre coucher:20.9},{Puissance:360},
{Temp Exterieure:18.4} Est ce que ce n'est pas plutôt &field1=18.8

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

Publié : 29 mai 2018, 16:20
par marcus_54
Bonjour papoo

J'ai trouvé et ça fonctionne bien
dit moi s’il y a un truc qui ne va pas
et encore merci !

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 = 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_key = 'xxxxxxxxxxxxxxxxx' -- 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="Temp Extérieure", field=1, nom="", canal=""}
-- 2eme compteur : device ="nom du device 2", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="Temp Salon", field=2, nom="", canal=""}
-- 3eme compteur : device ="nom du device 3", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="Temp veranda haut", field=3, nom="", canal=""}
les_devices[#les_devices+1] = {device="Solaire Production", field=4, nom="Solaire", canal="1"}
les_devices[#les_devices+1] = {device="Luminosite", field=5, nom="", canal=""}
les_devices[#les_devices+1] = {device="Barometre", field=6, nom="Pression", canal="2"}
les_devices[#les_devices+1] = {device="Temp Chambre coucher", field=7, nom="", canal=""}
les_devices[#les_devices+1] = {device="Compteur kWh Total", field=8, nom="puissance", canal="5"}

--------------------------------------------
----------- 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) % 1) == 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)
       	voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
end -- if time
-- ============================================================================
return commandArray   

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

Publié : 29 mai 2018, 17:06
par marcus_54
il restait un problème

en bas de programme, j'ai remplacé la ligne qui ne fonctionne pas (je ne sais pas pourquoi) :

Code : Tout sélectionner

os.execute('curl -m5 "'.. url_thingspeak ..'update?key=' .. API_key .. fields)
par celle ci et la tout semble OK

Code : Tout sélectionner

 commandArray[1]={['OpenURL']=url_thingspeak ..'update?key=' .. API_key .. fields } 

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

Publié : 29 mai 2018, 21:29
par papoo
curl est il installé sur ta machine?

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

Publié : 30 mai 2018, 07:58
par marcus_54
oui version 7.52.1

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

Publié : 15 janv. 2020, 16:34
par Fab59
Bonjour,
Je me permet de déterrer ce post, étant totalement novice dans tout ce qui est Iot, et apiculteur débutant j'ai cherché à me fabriquer une balance de ruche connectée.
Je me suis débrouillé avec mysensors et c'est plutôt concluant et stable, avec arduino pro-mini 3.3v sur batterie 18650 (Merci aux super tutos de Henri Bachetti sur son blog riton-duino).
Je n'utilise Domoticz uniquement pour des capteurs (pas d'actionneur) et je n'ai donc pas l'envie d'utiliser un VPN, et je voudrais fermer l'accès au serveur en distant.

Je n'ai strictement aucune compétence ou plutôt j'en avais aucune avant de me lancer dans ce projet et les scripts sont donc pour moi une science totalement occulte,
Chaque balance donc chaque nœud comprend 4 capteurs :
  • "Poids de la ruche" - cellule de charge MAVIN NA4
    "T°C de la cellule de charge" (pour une éventuelle compensation de la mesure de poids par rapport à la température) - DS18B20
    "Variation de poids" entre 2 mesures (pour le déclenchement d'alerte, ex : essaimage)
    "T°C et Hr" dans la ruche - SHT31D
J'aurais à terme une quinzaine de balance, avec pour chacune ces capteurs nommés strictement de la même manière, seul le nom du noeud changera pour me repérer.

Je ne retrouve pas dans le script d’occurrence aux noms des noeuds (node), je suppose donc que l'association se fait uniquement sur le nom du dispositif (child) et donc que je devrait faire un scrip par noeud (mais j'en sais rien en fait), mais comment associer chaque noeud a chaque script,

D'ailleurs que se passe-il lorsque l'on a plusieurs dispositif portant le même nom, ne vaudrait-il mieux pas faire référence à l'ID du dispositif ?

ça m'irait bien d'avoir un channel par ruche et donc une API par ruche,

Faut-il que je différencie les nom des dispositifs pour que ça soit possible ?
Par exemple :
  • "R001 - Poids de la ruche"
    "R001 - T°C de la cellule de charge"
    "R001 - Variation de poids"
    "R001 - T°C/Hr dans la ruche"
dernière question a la vue du dernier commentaire curl est-il nécessaire pour l'application de ce script ?

Merci d'avance,

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

Publié : 15 janv. 2020, 22:06
par papoo
Fab59 a écrit : 15 janv. 2020, 16:34 comment associer chaque nœud a chaque script
.../...
ça m'irait bien d'avoir un channel par ruche et donc une API par ruche,
Thingspeak n'accepte que 8 valeurs remontées par API il te faudra donc comme tu le suggere une aPI par ruche voir une API pour 2 ruches. si tu pars sur une API par ruche indique le numero de ruche dans le nom du fichier puis personnalise l'api et chacun des devices
Fab59 a écrit : 15 janv. 2020, 16:34 D'ailleurs que se passe-il lorsque l'on a plusieurs dispositif portant le même nom, ne vaudrait-il mieux pas faire référence à l'ID du dispositif ?
si les noms sont identiques domoticz ne pourra les différencier et cela ne fonctionnera pas
Fab59 a écrit : 15 janv. 2020, 16:34 Faut-il que je différencie les nom des dispositifs pour que ça soit possible ?
Par exemple :
  • "R001 - Poids de la ruche"
    "R001 - T°C de la cellule de charge"
    "R001 - Variation de poids"
    "R001 - T°C/Hr dans la ruche"
c'est une bonne idée, cela te permet de ne modifier que ce numero dans chaque script
Fab59 a écrit : 15 janv. 2020, 16:34 dernière question a la vue du dernier commentaire curl est-il nécessaire pour l'application de ce script ?
si openurl fonctionne pour toi pas besoin de curl comme marcus le signale

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

Publié : 20 janv. 2020, 10:00
par Fab59
Bonjour,
Merci pour ces réponses rapides et complètes,
J'ai tester le script avec curl et openurl et j'ai malgré tout le même message de problème de concaténation de la clé API,

Error: EventSystem: in export_ThingSpeak: [string "--[[script_time_export_ThingSpeak.lua..."]:126: attempt to concatenate local 'API_key' (a nil value)

Je suppose que ça vient donc des prérequis non-installés sur mon serveur, comment puis-je résoudre le problème ?

Merci d'avance,

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

Publié : 21 janv. 2020, 03:26
par denis_brasseur
Fab59 a écrit : 20 janv. 2020, 10:00 Bonjour,
Merci pour ces réponses rapides et complètes,
J'ai tester le script avec curl et openurl et j'ai malgré tout le même message de problème de concaténation de la clé API,

Error: EventSystem: in export_ThingSpeak: [string "--[[script_time_export_ThingSpeak.lua..."]:126: attempt to concatenate local 'API_key' (a nil value)

Je suppose que ça vient donc des prérequis non-installés sur mon serveur, comment puis-je résoudre le problème ?

Merci d'avance,

Ligne 21

Code : Tout sélectionner

local api_thingspeak = 'api_thingspeak' -- creer une variable de type chaine contenant votre code API Write KEY ThingSpeak
Il te faut créer une variable utilisateur de type chaine s'appelant api_thingspeak et contenant ton code API Write KEY ThingSpeak.
Capture.PNG
Capture.PNG (7.03 Kio) Consulté 5140 fois