[LUA] Exporter des données vers le site ThingSpeak

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.
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

[LUA] Exporter des données vers le site ThingSpeak

Message par papoo »

Bonjour,
un petit script me permettant d'exporter les données de certains de mes compteurs sur le site https://thingspeak.com/
afin de tester ce service.
Bien sur avant de mettre en place ce script, il faut s'inscrire, récupérer le numéro d'api WRITE lié au channel créé (que l'on peu décider de rendre public ou non)
ensuite nommer et activer les "fields" et noter la correspondance field/compteur
ensuite personnalisez le script avec votre clé API WRITE et lister vos devices avec le field associé dans le tableau les_devices
Sauvegarder le fichier, en le nommant script_time_CE_QUE_VOUS_VOULEZ.lua, dans le répertoire dédié aux scripts lua
Le script est lu toutes les minutes mais n'exporte les données que toutes les 4 minutes, valeur que vous pouvez bien sur modifier

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_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="Compteur Eau Froide", field=1, nom="", canal=""}
-- 2eme compteur : device ="nom du device 2", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="Compteur Eau Chaude", field=2, nom="", canal=""}
-- 3eme compteur : device ="nom du device 3", field=field ThingSpeak associé
les_devices[#les_devices+1] = {device="Compteur Gaz", field=3, nom="", canal=""}
les_devices[#les_devices+1] = {device="Compteur Prises", field=4, nom="", canal=""}
les_devices[#les_devices+1] = {device="Compteur Lumières", field=5, nom="", canal=""}
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 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] .. '},'
		elseif v ~= nil then
    fields = fields .. '{'.. sans_accent(d.device) .. ':' .. 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	
Vérifiez ensuite les premiers résultats sur le site
thingspeak.png
thingspeak.png (14.58 Kio) Consulté 13424 fois
Dernière modification par papoo le 28 mai 2018, 21:41, modifié 4 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
totof60
Messages : 373
Inscription : 29 avr. 2016, 09:31

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

Message par totof60 »

Mon premier post ... Pour dire merci à papoo pour son script qui fonctionne parfaitement
Je cherchais un script pour récupérer des infos sur Thingspeak et finalement le contraire me conviendra très bien
Merci
Domoticz V2022.2
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo »

Heureux que cela serve
Bienvenue ici totof60
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

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

Message par rimram31 »

Bravo.

thingspeak gratuit ? je ne trouve pas grand chose dans les conditions d'utilisation, a priori la limite de 8 est plus une limite de design de l'API non ?

J'ai toujours dans un coin de ma tête l'idée de pouvoir justement déposer ces données dz en ligne pour les exploiter indépendamment.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo »

La limite de 8 "fields" est par "channel" (groupe de données) à priori on peut créer plusieurs "channel" et pour l'instant j'ai un accès gratuit. je n'ai rien vu concernant une quelconque limitation de durée mais je suis peut être passé à coté. Je n'ai pas encore réalisé de graphique par contre
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

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

Message par papoo »

je viens de modifier le premier post pour une légère correction du script.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
roondar
Messages : 51
Inscription : 12 avr. 2016, 12:58

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

Message par roondar »

Merci pour le script.
tekmars
Messages : 26
Inscription : 20 déc. 2015, 22:00

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

Message par tekmars »

Je viens de tester, c'est parfait !
Merci papoo.
helvete
Messages : 34
Inscription : 03 janv. 2016, 21:51
Localisation : dans les alpes

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

Message par helvete »

super top ton script je cherchais justement a faire un export des données pour faire des graph personnalisé
merci
newbe sur domoticz
PI2, RFX,
sondes oregon scientifique, chacon
marcus_54
Messages : 425
Inscription : 28 févr. 2018, 12:15

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

Message par marcus_54 »

Bonsoir Papoo,

Il est super ton script !
Avant de connaitre Domoticz, je le faisais avec thinkspeak... il permet d'avoir des widgets sympas sur Android.

Y a t-il une solution quand le capteur sous Domoticz est composé de plusieurs champs ?
exemple chez moi

Code : Tout sélectionner

local les_devices = {}; -- pas plus de 8 devices
-- 1er compteur : name ="nom du device 1", field=field ThingSpeak associé
les_devices[1] = {name="Temp Extérieure", field=1}
-- 2eme compteur : name ="nom du device 2", field=field ThingSpeak associé
les_devices[2] = {name="Temp Salon", field=2}
-- 3eme compteur : name ="nom du device 3", field=field ThingSpeak associé
les_devices[3] = {name="Temp veranda haut", field=3}
les_devices[4] = {name="Solaire Production", field=4}
les_devices[5] = {name="Luminosite", field=5}
les_devices[6] = {name="Barometre", field=6}
les_devices[7] = {name="Temp Chambre coucher", field=7}
les_devices[8] = {name="Compteur kWh Total", field=8}
donne :

field1=19.6 OK
&field2=23.1 OK
&field3=28.9 OK
&field4=42 ;138790 c'est OK car c'est la première valeur qui m'intéresse
&field5=330
&field6=24.3;1015.3;1;691.73 ici c'est la pression qui m'intéresse 1015 donc ce n'est pas bon
&field7=22.3 OK
&field8=22983586;0;0;0;1090;0 ici c'est la puissance qui m'intéresse 1090 donc ce n'est pas bon
Domoticz 2024.7
Domoticz sur RPI 4B+ : MQTT; MQTTMapper; Zigbee; RFlink DIY 433; Téléinfo; DS18B20; Capteur; compteur eau wmbusmeter, NanoLeaf...
Répondre