Bonjour,
Je me suis inspiré du script précédent (merci pour la contribution !) et je l'ai adapté ainsi :
- Utilisation directement depuis Domoticz (pas besoin de tâche cron) : Setup > More Options > Events > LUA au lieu de Blockly > Time
- Mise à jour en utilisant les fonctions lua de Domoticz sans passer par json (ça évite de gérer les utilisateurs)
- N'ayant pas la valeur de PAPP remontée, je fais un calcul de puissance basé sur la comparaison entre deux valeurs d'index total.
- J'utilise trois objets "dummy" : Text sensor, Electricity (instant and counter) nommé "Compteur_EDF", Ampere (1 phase)
Il y a un exemple intéressant ici que j'ai troué un peu (trop) vers la fin : https://www.domoticz.com/wiki/Capturing_Energy_Usage_with_Lua_Scripts
Voilà, je vous livre le script ci-dessous si ça peut aider quelqu'un. A noter que c'est pour un compteur tempo. A adapter selon votre configuration et vos besoins.
---- Script pour récupérer les informations sur un Wifinfo. A mettre dans Domoticz dans "Events" en tant que script LUA / Time
----------------------------------------------------------------------------------------------------------
-- Paramètres
----------------------------------------------------------------------------------------------------------
debug = "yes" -- Turn debugging on ("yes") or off ("no")
frequence = 2 -- toutes les x minutes
-- adresse du fichier JSON de Wifinfo
local wifinfoURL = "http://192.168.1.210:80/json"
-- index des dispositifs (colonne IDX de domoticz)
-- Text sensor
device1 = "Tarif_EDF"
local colorIdx = otherdevices_idx[device1]
-- Electricity (instant and counter)
device2 = "Compteur_EDF"
local compteurIdx = otherdevices_idx[device2]
-- Ampere (1 phase)
device3 = "Intensité_EDF"
local intensiteIdx = otherdevices_idx[device3]
if debug=="yes" then
print(device1 .. " : idx " .. colorIdx)
print(device2 .. " : idx " .. compteurIdx)
print(device3 .. " : idx " .. intensiteIdx)
end
-- Domoticz (mise à jour de Domoticz par json, non utilisé)
--local domoURL = "http://127.0.0.1:8080/json.htm?"
--local urlParams = "type=command¶m=udevice&idx="
----------------------------------------------------------------------------------------------------------
-- Fonctions
----------------------------------------------------------------------------------------------------------
-- arrondi
function round2(num, numDecimalPlaces)
return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num))
end
-- écart de temps
function timedifference (s)
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
print("t1 = " .. t1)
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
print("t2 = " .. t2)
difference = os.difftime (t1, t2)
return difference
end
----------------------------------------------------------------------------------------------------------
-- CommandArray
----------------------------------------------------------------------------------------------------------
commandArray = {}
if ( ( os.time() / 60 ) % frequence ) == 0 then
-- inclure les bibliothèques Lua
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux
-- json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")() -- For Windows
-- récupération des données json
local config=assert(io.popen('/usr/bin/curl -s ' .. wifinfoURL))
local blocjson = config:read('*all')
config:close()
if debug=="yes" then
print ("Fichier JSON : " .. blocjson)
end
-- décodage des données
local jsonValeur = json:decode(blocjson)
-- affectation dans des variables
local papp = jsonValeur.PAPP
local iinst = jsonValeur.IINST
local coulJ = jsonValeur.PTEC
local coulD = jsonValeur.DEMAIN
local BBRHCJB = jsonValeur.BBRHCJB
local BBRHPJB = jsonValeur.BBRHPJB
local BBRHCJW = jsonValeur.BBRHCJW
local BBRHPJW = jsonValeur.BBRHPJW
local BBRHCJR = jsonValeur.BBRHCJR
local BBRHPJR = jsonValeur.BBRHPJR
local CPlein = BBRHPJB + BBRHPJW + BBRHPJR
local CCreux = BBRHCJB + BBRHCJW + BBRHCJR
local CTotal = CPlein + CCreux
-- un peu de modification de texte pour faciliter la lecture
coulJ = string.gsub(coulJ, "HPJB", "BLEU HP");
coulJ = string.gsub(coulJ, "HCJB", "BLEU HC");
coulJ = string.gsub(coulJ, "HPJW", "BLANC HP");
coulJ = string.gsub(coulJ, "HCJW", "BLANC HC");
coulJ = string.gsub(coulJ, "HPJR", "! ROUGE ! HP");
coulJ = string.gsub(coulJ, "HCJR", "! ROUGE ! HC");
-- obsolète - utilisation de deux variables utilisateur pour calculer les écarts et compenser l'absence de variable papp de certains compteurs
--local CTotal_old = uservariables["Index_temp"] -- on récupère l'index stocké dans la variable utilisateur Index_temp
--local time_old = uservariables["Time_temp"] -- on récupère l'heure stockée dans la variable utilisateur Time_temp
--local time_now = os.time()
--local ecart_index = CTotal - CTotal_old
--local ecart_sec = time_now - time_old
--commandArray['Variable:Index_temp']= tostring(CTotal) -- on met à jour la variable utilisateur avec le nouvel index
--commandArray['Variable:Time_temp']= tostring(time_now) -- on met à jour la variable utilisateur avec la nouvelle heure
-- on calcule l'écart de temps et d'index pour compenser l'absence de variable papp de certains compteurs
puissance_old, CTotal_old = string.match(otherdevices_svalues[device2], "(%d+%.*%d*);(%d+%.*%d*)") -- on récupère les valeurs stockées - inspiré de https://www.domoticz.com/wiki/Capturing_Energy_Usage_with_Lua_Scripts
puissance_old = tonumber(puissance_old)
CTotal_old = tonumber(CTotal_old)
local ecart_sec = timedifference(otherdevices_lastupdate[device2])
local ecart_index = CTotal - CTotal_old
-- si PAPP n'est pas disponible, on calcule avec les écarts
if (papp == nil) then
-- obsolète - puissance = iinst * 230 -- pas bien précis
puissance = ecart_index / ecart_sec * 3600
else
puissance = papp * 0.9 -- en prenant un facteur de puissance à 0.9
end
puissance = round2(puissance,0)
if debug=="yes" then
print("Index total (nouveau): " .. CTotal .. " Wh")
print("Index total (ancien): " .. CTotal_old .. " Wh")
print("Ecart index : " .. ecart_index .. " Wh")
print("Ecart de temps : " .. ecart_sec .. " s")
print ("Puissance : " .. puissance .. " W")
end
-- construction des paramètres
-- voir https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s pour la syntaxe de nvalue|svalue
local param1 = colorIdx ..'|0|' .. coulJ .. ' / Demain : ' .. coulD
local param2 = compteurIdx ..'|0|' .. puissance .. ';' .. CTotal
local param3 = intensiteIdx ..'|0|' .. iinst
-- construction des url (mise à jour de Domoticz par json, non utilisé)
--url1 = domoURL .. urlParams .. teleinfoIdx .. '&nvalue=0&svalue=' .. CPlein .. ';' .. CCreux .. ';0;0;' .. papp .. ';0;'
--url2 = domoURL .. urlParams .. colorIdx .. '&nvalue=0&svalue=' .. coulJ .. '%20%2F%20Demain%20' .. coulD
if debug=="yes" then
print("Paramètre 1 : " .. param1)
print("Paramètre 2 : " .. param2)
print("Paramètre 3 : " .. param3)
end
-- mise à jour des objets
-- commandArray['UpdateDevice']='idx|nValue|sValue' -- for updating Dummy devices e.g. '96|0|Hello World'
-- http://www.domoticz.com/wiki/LUA_commands
table.insert (commandArray, { ['UpdateDevice'] = param1 } )
table.insert (commandArray, { ['UpdateDevice'] = param2 } )
table.insert (commandArray, { ['UpdateDevice'] = param3 } )
-- appel successif des url (mise à jour de Domoticz par json, non utilisé)
--local doIt=assert(io.popen('/usr/bin/curl -s "' .. url1 .. '"'))
--doIt:read('*all')
--doIt:close()
--doIt=assert(io.popen('/usr/bin/curl -s "' .. url2 .. '"'))
--doIt:read('*all')
--doIt:close()
end
return commandArray
Sébastien