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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
--[[ 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 ("<font color='#f3031d'>".. s .."</font>") else print ("<font color='#f3031d'>aucune valeur affichable</font>") 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