LUA : Récupération des informations du site ecopellets

le script pourrait être beaucoup plus simple, mais j’ai pris le parti de faire en sorte qu’il soit le plus facile à utiliser.
ce script ne fait que récupérer les données json du site https://www.ecopellets.fr/ et mets à jour les devices que l’on souhaite utiliser.
il s’exécute toutes les 30 minutes, modifiable via la variable delai
il créé automatiquement les devices listés dans le tableau les_devices si ils n’existent pas.

chaque device est déclaré via une ligne
les_devices[#les_devices+1] = {device= » », nom = » », sensortype = » »}


vous pouvez modifier le champs nom mais pas le champs device
le champs sensortype vous permets de créer le device que vous souhaitez. pour ce script
le sensortype 5 correspond à un device texte
le sensortype 113 correspond à un device compteur
la création d’un compteur se fait en deux étapes car par défaut il est de type energy :
-on créé d’abord le device via la fonction CreateVirtualSensor comme tout les devices
-ensuite on change son subtype à 3 pour en faire un custom counter

--[[
name : script_time_pellets.lua
auteur : papoo
date de création : 15/02/2018
Date de mise à jour : 18/03/2018
Principe : ce script utilise l'api du site https://www.ecopellets.fr/ 
https://pon.fr/lua-recuperation-des-informations-du-site-ecopellets/
https://github.com/papo-o/domoticz_scripts/blob/master/Lua/script_time_pellets.lua
http://easydomoticz.com/forum/viewtopic.php?f=10&t=6122&p=51452#p51452
/!\attention/!\
si vous souhaitez utiliser ce script dans l'éditeur interne, pour indiquer le chemin complet vers le fichier JSON.lua, il vous faudra changer la ligne 
json = assert(loadfile(luaDir..'JSON.lua'))()
par 
json = assert(loadfile('/le/chemin/vers/le/fichier/lua/JSON.lua'))()
exemple :
json = assert(loadfile('/home/pi/domoticz/scripts/lua/JSON.lua'))()
la reconnaissance automatique du chemin d'exécution de ce script ne fonctionnant pas dans l'éditeur interne

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

local debugging = true                                                      -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local script_actif = true                                                  -- active (true) ou désactive (false) ce script simplement
local delai = 30                                                             -- délai d'exécution de ce script en minutes de 1 à 59 (délai entre deux appels à l'API)
local url_info_pellets = "https://www.ecopellets.fr/appjson.php?uniqid="    -- Adresse de l'API ecopellets
local uniqid = "c49f8579b9aec326eac372e8a7xxxxx"                           -- votre uniqid
local domoticzURL = "127.0.0.1:8080"
local les_devices = {};
-- comment remplir le tableau les_devices ?  
-- device = le nom du dispositif à créer/incrémenter
-- sensortype = le ype de device à créer/incrémenter  
-- commentez les devices que vous ne souhaitez pas utiliser
-- les_devices[#les_devices+1] = {device="", nom ="", sensortype =""}
les_devices[#les_devices+1] = {device = "qtemois" , nom = "Consommation mois en cours", sensortype = 113} -- 1er device
les_devices[#les_devices+1] = {device = "prixmois" , nom = "Coût mensuel", sensortype = 113} -- 2éme device
les_devices[#les_devices+1] = {device = "tendance" , nom = "Tendance", sensortype = 113} -- 3éme device
les_devices[#les_devices+1] = {device = "stock0" , nom = "Stock zéro", sensortype = 113} -- 4éme device
les_devices[#les_devices+1] = {device = "datestock0" , nom = "Date stock zéro", sensortype = 5} -- 5éme device
les_devices[#les_devices+1] = {device = "qtelastmonth" , nom = "Quantité mois passé", sensortype = 113} -- 6éme device
les_devices[#les_devices+1] = {device = "prixlastmonth" , nom = "Coût mois passé", sensortype = 113} -- 7éme device
les_devices[#les_devices+1] = {device = "qtesept" , nom = "Quantité depuis septembre", sensortype = 113} -- 8éme device
les_devices[#les_devices+1] = {device = "coutsept" , nom = "Coût depuis septembre", sensortype = 113} -- 9éme device
les_devices[#les_devices+1] = {device = "qtestock" , nom = "État du stock", sensortype = 113} -- 10éme device
les_devices[#les_devices+1] = {device = "prixstock" , nom = "Coût du stock", sensortype = 113} -- 11éme device
les_devices[#les_devices+1] = {device = "coutotal" , nom = "Coût total", sensortype = 113} -- 12éme device
les_devices[#les_devices+1] = {device = "coutreparation" , nom = "Coût réparation", sensortype = 113} -- 13éme device
les_devices[#les_devices+1] = {device = "coutentretien" , nom = "Coût entretien", sensortype = 113} -- 14éme device

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
--------------------------------------------
------------- Autres Variables -------------
--------------------------------------------
local nom_script = 'Infos ecopellets.fr'
local version = '1.1'
curl = '/usr/bin/curl -m 5 '		 	    -- pour linux, ne pas oublier l'espace à la fin
-- curl = 'c:\\Programs\\Curl\\curl -m 5 '  -- pour windows, ne pas oublier l'espace à la fin
-- chemin vers le dossier lua
	if (package.config:sub(1,1) == '/') then
		 luaDir = debug.getinfo(1).source:match("@?(.*/)")
	else
		 luaDir = string.gsub(debug.getinfo(1).source:match("@?(.*\\)"),'\\','\\\\')
	end
	json = assert(loadfile(luaDir..'JSON.lua'))()						-- chargement du fichier JSON.lua
--json = assert(loadfile('/home/pi/domoticz/scripts/lua/JSON.lua'))() --Linux    
--------------------------------------------
----------- Fin Autres Variables -----------
--------------------------------------------	
--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
function voir_les_logs(s, debugging)
    if (debugging) then 
		if s ~= nil then
        print ("".. s .."")
		else
		print ("aucune valeur affichable")
		end
    end
end	

--------------------------------------------
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 CreateVirtualSensor(dname, sensortype)
    -- recherche d'un hardware dummy pour l'associer au futur device
    local config = assert(io.popen(curl..'"'.. domoticzURL ..'/json.htm?type=hardware" &'))
    local blocjson = config:read('*all')
    config:close()
    local jsonValeur = json:decode(blocjson)
    if jsonValeur ~= nil then
       for Index, Value in pairs( jsonValeur.result ) do
           if Value.Type == 15 then -- hardware dummy = 15
              voir_les_logs("--- --- --- idx hardware dummy  : ".. Value.idx .." --- --- ---",debugging)
              voir_les_logs("--- --- --- Nom hardware dummy  : ".. Value.Name .." --- --- ---",debugging)                  
              id = Value.idx
           end  
       end
    end

    if id ~= nil then -- si un hardware dummy existe on peut créer le device
        voir_les_logs("--- --- --- création du device   : ".. dname .. " --- --- ---",debugging)
        voir_les_logs(curl..'"'.. domoticzURL ..'/json.htm?type=createvirtualsensor&idx='..id..'&sensorname='..url_encode(dname)..'&sensortype='..sensortype..'"',debugging)
        os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=createvirtualsensor&idx='..id..'&sensorname='..url_encode(dname)..'&sensortype='..sensortype..'"')

        voir_les_logs("--- --- --- device   : ".. dname .. " créé --- --- ---",debugging)         
    end
    -- else     
        -- local attribut = DeviceInfos(dname)
        -- if attribut then
            -- if attribut.SwitchTypeVal == 0 then
                -- voir_les_logs("--- --- --- modification du device RFXMeter  : ".. dname .. " en compteur de type 3  --- --- ---",debugging) 
                -- os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=setused&idx='..otherdevices_idx[dname]..'&name='..url_encode(dname)..'&switchtype=3&used=true"')
            -- end
        -- else
            -- voir_les_logs("--- --- --- impossible d\'extraire les caractéristiques du compteur ".. dname .."  --- --- ---",debugging)
        -- end
--https://github.com/domoticz/domoticz/blob/development/hardware/hardwaretypes.h

end 
--------------------------------------------
function DeviceInfos(device)  
    --[[
        inspiré de  http://www.domoticz.com/forum/viewtopic.php?f=61&t=15556&p=115795&hilit=otherdevices_SwitchTypeVal&sid=dda0949f5f3d71cb296b865a14827a34#p115795
    Attributs disponibles :
    AddjMulti; AddjMulti2; AddjValue; AddjValue2; BatteryLevel; CustomImage; Data; Description; Favorite; 
    HardwareID; HardwareName; HardwareType; HardwareTypeVal; HaveDimmer; HaveGroupCmd; HaveTimeout; ID; 
    Image; IsSubDevice; LastUpdate; Level; LevelInt; MaxDimLevel; Name; Notifications; PlanID; PlanIDs; 
    Protected; ShowNotifications; SignalLevel; Status; StrParam1; StrParam2; SubType; SwitchType; 
    SwitchTypeVal; Timers; Type; TypeImg; Unit; Used; UsedByCamera; XOffset; YOffset; idx
    --]]
local idx =  otherdevices_idx[device]   
    if idx then
        local config = assert(io.popen(curl..'"'.. domoticzURL ..'/json.htm?type=devices&rid='..otherdevices_idx[device]..'"'))
        local blocjson = config:read('*all')
        config:close()
        local jsonValeur = json:decode(blocjson)
        if jsonValeur ~= nil then
            return json:decode(blocjson).result[1]    
        end
    end    
end --[[usage : 
        local attribut = DeviceInfos(device)
        if attribut.SwitchTypeVal == 0 then    end
    --]]
    
--------------------------------------------
function ConvertCounter(devicename)
local attribut = DeviceInfos(devicename)
    if attribut then
        if attribut.SwitchTypeVal == 0 then
            voir_les_logs("--- --- --- modification du device RFXMeter  : ".. devicename .. " en compteur de type 3  --- --- ---",debugging) 
            os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=setused&idx='..otherdevices_idx[devicename]..'&name='..url_encode(devicename)..'&switchtype=3&used=true"')
        end
    else
        voir_les_logs("--- --- --- impossible d\'extraire les caractéristiques du compteur ".. devicename .."  --- --- ---",debugging)
    end
end   
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
time = os.date("*t")

if script_actif == true then
    if ((time.min-1) % delai) == 0 then -- toutes les xx minutes en commençant par xx:01    
        voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
        --=========== Lecture json ===============--
        local config = assert(io.popen(curl..' "'.. url_info_pellets .. uniqid ..'"')) 
        --end
        local blocjson = config:read('*all')
        config:close()
        local jsonValeur = json:decode(blocjson)
        if jsonValeur then
            qtemois = jsonValeur.qtemois
            prixmois = jsonValeur.prixmois
            tendance = jsonValeur.tendance
            stock0 = jsonValeur.stock0
            datestock0 = jsonValeur.datestock0
            qtelastmonth = jsonValeur.qtelastmonth
            prixlastmonth = jsonValeur.prixlastmonth
            qtesept = jsonValeur.qtesept
            coutsept = jsonValeur.coutsept
            qtestock = jsonValeur.qtestock
            prixstock = jsonValeur.prixstock
            coutotal = jsonValeur.coutotal
            coutreparation = jsonValeur.coutreparation            
            coutentretien = jsonValeur.coutentretien             
            if qtemois ~= nil then voir_les_logs('--- --- --- qtemois : '..qtemois,debugging) end
            if prixmois ~= nil then  voir_les_logs('--- --- --- prixmois : '..prixmois,debugging) end
            if tendance ~= nil then voir_les_logs('--- --- --- tendance : '..tendance,debugging) end
            if stock0 ~= nil then voir_les_logs('--- --- --- stock0 : '..stock0,debugging) end
            if datestock0 ~= nil then voir_les_logs('--- --- --- datestock0 : '..datestock0,debugging) end
            if qtelastmonth ~= nil then voir_les_logs('--- --- --- qtelastmonth : '..qtelastmonth,debugging) end
            if prixlastmonth ~= nil then voir_les_logs('--- --- --- prixlastmonth : '..prixlastmonth,debugging) end
            if qtesept ~= nil then voir_les_logs('--- --- --- qtesept : '..qtesept,debugging) end
            if coutsept ~= nil then voir_les_logs('--- --- --- coutsept : '..coutsept,debugging)
            else coutsept = 0
                voir_les_logs('--- --- --- coutsept : '..coutsept,debugging)
            end
            if qtestock ~= nil then voir_les_logs('--- --- --- qtestock : '..qtestock,debugging) end
            if prixstock ~= nil then voir_les_logs('--- --- --- prixstock : '..prixstock,debugging) end
            if coutotal ~= nil then voir_les_logs('--- --- --- coutotal : '..coutotal,debugging) end          
            if coutreparation ~= nil then voir_les_logs('--- --- --- coutreparation : '..coutreparation,debugging) 
            else
                coutreparation = 0
                voir_les_logs('--- --- --- coutreparation : '..coutreparation,debugging) 
            end             
            if coutentretien  ~= nil then  
                voir_les_logs('--- --- --- coutentretien : '..coutentretien,debugging) 
            else 
                coutentretien = 0 
                voir_les_logs('--- --- --- coutentretien : '..coutentretien,debugging) 
            end 
            for k,v in pairs(les_devices) do
                local Vdevice = v.device
                local Vnom = v.nom
                local Vtype = v.sensortype
                voir_les_logs('--- --- --- device : '..Vdevice..' nom  : '..Vnom.. ' sensortype : '..Vtype,debugging)
                if otherdevices[Vnom] == nil then
                    CreateVirtualSensor(Vnom, Vtype) 
                    voir_les_logs('--- --- --- création device : '..Vdevice.. ' sensortype : '..Vtype,debugging)
                end
                if Vtype == 113 then 
                    ConvertCounter(Vnom)
                end 
                
                
                if otherdevices[Vnom] ~= nil then

                local variable = tostring(_G[Vdevice])
                    --print(variable)
                    voir_les_logs("--- --- --- mise à jour  ".. Vnom.." : "..variable,debugging)
                    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[Vnom] .. '|0|'..tostring(variable)} --mise à jour du device
                    voir_les_logs("--- --- --- ".. Vdevice.." a été mis à jour",debugging)
                end
            end        
        else
            voir_les_logs('--- --- --- aucun résultat à décoder',debugging)
        end --if jsonValeur
    -- ====================================================================================================================	

    voir_les_logs("======== Fin ".. nom_script .." (v".. version ..") ==========",debugging)        
    end --if time       
end -- if script_actif
return commandArray

Retrouvez la dernière version de ce script sur



 Site Officiel :   github.com

Laisser un commentaire