Mise à jour !
Je me contente maintenant de ne lancer qu'une seule tâche toutes les 2 minutes.
En fait, j'envoie toutes les données souhaitées dans Dz via une seule requête HTTP GET.
Voici la tâche à saisir dans tasker et à lancer toutes les 2 minutes:
Code : Tout sélectionner
A1: Lancer un Shell[
Commande:sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select maxpower,value,timestamp from fludia_index order by id desc limit 1;"
Délai (Secondes):0
Utiliser root:On
Stocker la sortie dans:%fludia
]
A2: Lancer un Shell [
Commande:sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select value,sensor,timestamp from hygrometry where sensor = 1002 or sensor = 1003 or sensor = 1 order by id desc limit 3;"
Délai (Secondes):0
Utiliser root:On
Stocker la sortie dans:%hygro
]
A3: Lancer un Shell [
Commande:sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select value,sensor,timestamp from temperature where sensor = 1002 or sensor = 1003 or sensor = 1 order by id desc limit 3;"
Délai (Secondes):0
Utiliser root:On
Stocker la sortie dans:%temp
]
A4: Conversion de variable [
Nom:%hygro
Fonction:URL Encode
]
A5: Conversion de variable [
Nom:%temp
Fonction:URL Encode
]
A6: Get HTTP [
Serveur:Port:192.168.15.21
Chemin:/json.htm?type=command¶m=udevices&script=powerTBH.lua&fludia=%fludia&hygro=%hygro&temp=%temp&luminosite=%LIGHT
Délai:27
]
A7: Attendre [ MS:0 Secondes:30 Minutes:0 Heures:0 Jours:0 ]
A8: Lancer un Shell [
Commande:sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select maxpower,value,timestamp from fludia_index order by id desc limit 1;"
Délai (Secondes):0
Utiliser root:On
Stocker la sortie dans:%fludia
]
A9: Get HTTP [
Serveur:Port:192.168.15.21
Chemin:/json.htm?type=command¶m=udevices&script=powerTBH.lua&fludia=%fludia
Délai:27
]
A10: Attendre [ MS:0 Secondes:30 Minutes:0 Heures:0 Jours:0 ]
A11: Lancer un Shell [
Commande:sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select maxpower,value,timestamp from fludia_index order by id desc limit 1;"
Délai (Secondes):0
Utiliser root:On Stocker la sortie dans:%fludia
]
A12: Get HTTP [
Serveur:Port:192.168.15.21
Chemin:/json.htm?type=command¶m=udevices&script=powerTBH.lua&fludia=%fludia
Délai:27
]
A13: Attendre [ MS:0 Secondes:30 Minutes:0 Heures:0 Jours:0 ]
A14: Lancer un Shell [
Commande:sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select maxpower,value,timestamp from fludia_index order by id desc limit 1;"
Délai (Secondes):0
Utiliser root:On Stocker la sortie dans:%fludia
]
A15: Get HTTP [
Serveur:Port:192.168.15.21
Chemin:/json.htm?type=command¶m=udevices&script=powerTBH.lua&fludia=%fludia
Délai:28
]
Ensuite, dans le repertoire /home/pi/domoticz/scripts/lua_parsers
J'ai mis le script powerTBH.lua :
Code : Tout sélectionner
---------------------------------
-- Script parseur de données provenant du Tableau de Bord de l'Habitat
-- http://www.projet-tbh.fr
--
-- Auteur : Neutrino
-- Date : 25 Novembre 2015
--Source : http://easydomoticz.com/forum/viewtopic.php?f=16&t=859
---------------------------------
local function split(str, sep)
--Convertie une chaine avec des séparateurs en un tableau
if sep == nil then
sep = "%s"
end
if(str == nil)then
str=""
end
local t={} ; i=1
local regex = string.format("([^%s]+)", sep)
for str in str:gmatch(regex) do
t[i] = str
i = i + 1
end
return t
end
local function timedifference(s)
--retourne la difference en secondes entre maintenant et la date envoyée
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()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
local function arrondir(num, dec)
--arrondit au nombre de decimales voulues
if num == 0 then
return 0
else
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end
end
local idxFludia = 135 --capteur Electrique (instant + Compteur)
local idxSDB = 113 --capteur de temperature/hygrometrie
local idxExterieur = 112 --capteur de temperature/hygrometrie
local idxTBH = 114 --capteur de temperature/hygrometrie
local idxLuminositeTBH = 159 --capteur de luminosité
local TBH = {}
local SDB = {}
local exterieur = {}
local fludia = split(uri['fludia'],"|") -- récupération des données fludia : puissance max|index|timestamp
local hygro = split(uri['hygro'], "\n") -- récupération des mesures hygrometriques
local temp = split(uri['temp'],"\n") --récupération des températures
local luminosite = uri['luminosite'] -- récupération de la luminosité lue par le capteur de la tablette
----------traitement luminosite
if(luminosite~=nil)then
domoticz_updateDevice(idxLuminositeTBH,' ',tonumber(luminosite))
end
---------traitement fludia
if(timedifference(os.date('%Y-%m-%d %H:%M:%S', fludia[3]))<120)then
--les données ont moins de 2 minutes, on les met à jour
domoticz_updateDevice(idxFludia,'',fludia[1]..";"..fludia[2])
else
print("TBH puissance : données trop anciennes !")
end
-----------traitement hygrométries
for i, lignehygro in ipairs(hygro) do
confort = 0
hygrometrie,capteur,timestamp = lignehygro:match("([^;]+)|([^;]+)|([^;]+)")
if(timedifference(os.date('%Y-%m-%d %H:%M:%S', timestamp))<900)then
hygrometrie = tonumber(hygrometrie)
if(capteur=='1')then
--correction de l'hygrometrie de la tablette
hygrometrie = hygrometrie*1.5
if(hygrometrie>100)then
hygrometrie = 100
end
end
if(hygrometrie<30)then
confort = 2
elseif(hygrometrie>=30 and hygrometrie<38)then
confort = 1
elseif(hygrometrie>=30 and hygrometrie<70)then
confort = 0
else
confort = 3
end
if(capteur=='1')then
TBH["hygro"]=hygrometrie
TBH["confort"]=confort
elseif(capteur=='1002')then
exterieur["hygro"]=hygrometrie
exterieur["confort"]=confort
elseif(capteur=='1003')then
SDB["hygro"]=hygrometrie
SDB["confort"]=confort
end
else
print("TBH hygro "..capteur.." : données trop anciennes !")
end
end
--------------------traitement temperatures
for i, lignetemp in ipairs(temp) do
temperature,capteur,timestamp = lignetemp:match("([^;]+)|([^;]+)|([^;]+)")
if(timedifference(os.date('%Y-%m-%d %H:%M:%S', timestamp))<900)then
if(capteur=='1')then
--capteur interne de la tablette
TBH["temp"]=arrondir(temperature,1)
elseif(capteur=='1002')then
--capteur extérieur
exterieur["temp"]=arrondir(temperature,1)
elseif(capteur=='1003')then
--capteur confort
SDB["temp"]=arrondir(temperature,1)
end
else
print("TBH temperature "..capteur.." : données trop anciennes !")
end
end
----Envoie des données
if((TBH["temp"]~=nil and TBH["hygro"]~=nil)and(TBH["temp"]~=0 and TBH["hygro"]~=0))then
domoticz_updateDevice(idxTBH,'',TBH["temp"]..";"..TBH["hygro"]..";"..TBH["confort"])
end
if(SDB["temp"]~=nil and SDB["hygro"]~=nil)then
domoticz_updateDevice(idxSDB,'',SDB["temp"]..";"..SDB["hygro"]..";"..SDB["confort"])
end
if(exterieur["temp"]~=nil and exterieur["hygro"]~=nil)then
domoticz_updateDevice(idxExterieur,'',exterieur["temp"]..";"..exterieur["hygro"]..";"..exterieur["confort"])
end
Ce script nécessite dans Dz quelques capteurs virtuels :
- un capteur Electrique (instant + Compteur) : enregistre la consommation Wh, et la puissance instantanée.
- un capteur de température;hygrométrie pour le capteur confort
- un capteur de température;hygrométrie pour le capteur météo
- un capteur de température;hygrométrie pour le capteur interne de la tablette
- un capteur de luminosité pour le capteur interne de la tablette
Cette fonctionnalité de Lua_parsers est vraiment géniale
