Projet TBH

Forum dédié à tous les sujets sans liens avec DomoticZ.
Discuter de tout et de rien, c'est ici.
webstar
Messages : 4
Inscription : 11 nov. 2015, 21:18

Re: Projet TBH

Message par webstar »

Neutrino a écrit :
webstar a écrit : et de plus pour la température, la comme | cut ne fonctionne pas chez moi :((
J'ai ajouté

Code : Tout sélectionner

| cut -c 4
pour tronquer la variable de température.
Il me semble que cela fait partie de BusyBox Free.
Je n'ai plus de problème de plantage :roll: pourvu que ça dure.
Je viens de découvrir la fonction lua_parser : http://www.domoticz.com/wiki/Inserting_ ... ua_parsers
Je vais voir quand j'aurai le temps pour adapter les taches tasker à cette fonction.
Cela permettra de n'envoyer qu'une seule requête HTTP avec toutes les infos dans l'URL.
Un script LUA s'occupe de parser le tout et de ranger ça dans les bons dispositifs :)
Merci Neutrino, mon problème venait de ma BusyBox qui n'était pas la bonne (il y en a des dizaines sur le store) - La j'ai pris la BusyBox X (Robert Nediyakalaparambil{root]...plus d'erreur mais aucune remonté dans mon capteur virtuel Domoticz :oops:

Quand je saisie la commande sqlite3 /data/data/com.ecoco2.tbh/databases/database.db "select value from temperature where sensor=1 order by id desc limit 1;" | cut -c -4, j'ai bien la valuer de température sans les XX chiffres après la virgule.

Dans tasker j'ai mis en suivant l'exemple (9 étant le numéro Idx dans domoticz de mon capteur virtuel, tempTBH et hygroTBH les valeur stockées par tasker)

/json.htm?command&param=udevice&idx=9&nvalue=0&svalue=%tempTBH;%hygroTBH;0

Mais rien de remonte dans mon capteur :(

J'en profites pour redemander à une Âme charitable de nous dire comment ? mesure la consommation journalière ? A partir du relevé de la TBH ?
Car pour récupérer la valeur instantanée de la consommation, ça fonctionne parfaitement par contre :)

Merci d'avance et Bon Domoticz et TBH à tous :)
Dernière modification par webstar le 22 nov. 2015, 16:37, modifié 1 fois.
:arrow: Je tente de faire fonctionner RASPBERRY PI2 + DOMOTICZ v2.3674 + RFXCOM433E + Tablette ARCHOS Projet TBH :roll:
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Projet TBH

Message par Neutrino »

Utilises-tu un mot de passe pour accéder à l'interface Domoticz ?
Si tu colles l'URL dans un navigateur, la température est-elle mise à jour ?
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Projet TBH

Message par Neutrino »

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&param=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&param=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&param=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&param=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 :)
Dernière modification par Neutrino le 29 nov. 2015, 12:21, modifié 3 fois.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
plouf02
Messages : 1
Inscription : 25 nov. 2015, 18:46

Re: Projet TBH

Message par plouf02 »

Merci pour toutes ces infos!

Le seul capteur que je n'arrive pas à faire fonctionner concerne la luminosité de la tablette malgré le fait qu'il soit activé dans les options de Tasker.

Une idée?
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Projet TBH

Message par Neutrino »

Regarde ici : http://techno-bidouille.com/android-exp ... -capteurs/
Revenez en arrière et cliquez sur le bouton Play, une popup s’affiche avec le contenu de votre variable. Si ce n’est pas le cas, revenez une nouvelle fois en arrière et attendez que votre profil se lance. En effet, certaines variables, notamment les variables dites “dynamiques” ne s’initialisent que si elles font partie d’une tâche utilisée dans un profil ou un widget.
C'est peut-être ça.
Après, le capteur de luminosité est vraiment naze.
Exemple TBH :
Lumi TBH.PNG
Lumi TBH.PNG (69.68 Kio) Consulté 9301 fois
Et avec une photo résistance (l'info en Lux ne correspond pas au Lux réel, mais ça donne une idée)
Lumi Photoresistance.PNG
Lumi Photoresistance.PNG (70.13 Kio) Consulté 9301 fois
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Projet TBH

Message par deennoo »

Un comparatif en live :
viewtopic.php?f=7&t=1008
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Projet TBH

Message par Neutrino »

Nouvelle version en cours de déploiement :) :
De l'horrible forum TBH, Pierre a écrit :Bonjour à tous,

Je viens de publier la mise à jour 1.1.0 (56), dont voici les changements :

* Version 1.1.0 (56):
- Ajout de succès
- Ajout des options avancées sur la puissance instantanée, déblocables sur succès
- Les puissances en heures pleines / heures creuses sont maintenant affichées sur la courbe de charge
- La puissance maximum de la journée est maintenant affichée sur la courbe de charge
- Modification du format de stockage des données d'index pour préparer les futures mises à jour
- Correction de quelques bugs
- Possibilité de reconnecter son compte en cas de suppression

Cette version corrige notamment le problème qui empêchait les capteurs météo et le module Fludia de communiquer avec la tablette après une mise à jour.

Elle modifie également le format de stockage des données issues du module Fludia. De nombreuses données sont ainsi recalculées lors de l'installation de la mise à jour. Nous affichons donc un message avec une barre de progression. Une fois l'opération terminée, la tablette resynchronise l'ensemble de ses données avec notre serveur.

Cette opération peut prendre un certain temps ( de quelques minutes à plusieurs heures), pendant lequel l'application sera très lente à l'utilisation. D'autre part, cela introduit une charge importante pour notre serveur. Nous avons donc décidé de publier cette mise à jour par paliers, pendant plusieurs jours. Tout le monde n'y aura pas accès tout de suite, mais si tout se passe bien on rajoutera chaque jour un certain pourcentage des utilisateurs qui y ont accès jusqu'à atteindre les 100%.

Cette mise à jour prépare l'arrivée des suivantes, qui dans l'ordre apporteront la courbe de consommation en kWh et en Euros, ainsi que la répartition de vos consommations par usages et le retour de l'application "Usages" que certains ont pu apercevoir.

Comme d'habitude, si vous constatez le moindre problème n'hésitez pas à ouvrir un ticket sur notre interface de support !
Bon, j'attends de l'avoir pour mettre à jour les requêtes Tasker et le script Lua_parsers.
On verra ce qu'il y aura dans cette nouvelle structure et si cette nouvelle version corrigera les plantages en série que je subis depuis 3 semaines.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
webstar
Messages : 4
Inscription : 11 nov. 2015, 21:18

Re: Projet TBH

Message par webstar »

Alors là chapeau :)

Merci Neutrino !!!! :o
:arrow: Je tente de faire fonctionner RASPBERRY PI2 + DOMOTICZ v2.3674 + RFXCOM433E + Tablette ARCHOS Projet TBH :roll:
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Projet TBH

Message par Neutrino »

De rien ;)

La base n'a pas vraiment changée, surtout des ajouts :), donc les scripts tasker et lua_parsers ne changent pas :D

En faisant un petit tour sur le forum de Jeedom, Izidor78 nous a écrit un srcipt PHP pour récupérer les données via le site web, pas besoin de modifier la tablette.
Lien du topic : https://www.jeedom.fr/forum/viewtopic.p ... &start=200
En le modifiant un peu, cela donne tbhweb.php:

Code : Tout sélectionner

<?php
///////////////////////////////////////////////
// Slush Coin Check
///////////////////////////////////////////////

if($argc == 3) {
    $username =  $argv[1];
    $password =  $argv[2];
} else {
    die("Usage: username password\n");
}


///////////////////////////////////////////////
// Create the temporary cookie
///////////////////////////////////////////////

$cookiefile = tempnam("", "slush_");

///////////////////////////////////////////////
// Get CSRF
///////////////////////////////////////////////

$url = "https://mon.projet-tbh.fr/accounts/login/?next=/";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);

preg_match("/<input type='hidden' name='csrfmiddlewaretoken' value='(.*?)' \/>/", $data, $csrf);

///////////////////////////////////////////////
// Login to Slush
///////////////////////////////////////////////

$url = "https://mon.projet-tbh.fr/accounts/login/?next=/";
$postfields = "csrfmiddlewaretoken=$csrf[1]&username=$username&password=$password";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 20);
$data = curl_exec($curl);
curl_close($curl);

///////////////////////////////////////////////
// Visit earnings page
///////////////////////////////////////////////

$url = "https://mon.projet-tbh.fr/confort/data-confort-instantane";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);

///////////////////////////////////////////////
// Capture current temperature
///////////////////////////////////////////////

try{ 
   $temperature = json_decode($data, true);
    echo $temperature['temp_int'] . ";" . $temperature['hygro_int'] . ";" . $temperature['temp_ext'] . ";" . $temperature['hygro_ext'];


} catch(Exception $e){
    echo($e);
}


///////////////////////////////////////////////
// Clean up cookie
///////////////////////////////////////////////

unlink($cookiefile);
?>
Pour l'exécuter, il faut avoir PHP d'installé bien évidemment.
Ensuite, on peut l'appeler dans un script_time_tbhweb.lua par exemple :

Code : Tout sélectionner

commandArray = {}
---récupère l'heure en minutes
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
maintenant=tonumber(hours*60+minutes)


if(maintenant%10 ==0 )then
	local appelTBH=assert(io.popen("php /home/pi/domoticz/scripts/tbhweb.php IDENTIFIANT_TBH MOTDEPASSE_TBH"))

	local tempHyroTBH = appelTBH:read('*all')
	appelTBH:close()
	tempInt,hygroInt,tempExt,hygroExt = tempHyroTBH:match("([^;]+);([^;]+);([^;]+);([^;]+)")
	print(tempInt.." "..hygroInt.." "..tempExt.." "..hygroExt)
	--Ensuite remplissez votre commandArray avec les données recueillies :)

end
return commandArray
ça marche bien pour les températures et hygrométries.
La fréquence de rafraîchissement est trop lente pour l'affichage de la puissance.
Pour l'instant, la synchro tablette/site web n'est pas très stable. Un peu de patience le temps que tout revienne à la normale :)
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
slybreiz
Messages : 89
Inscription : 14 oct. 2015, 14:33

Re: Projet TBH

Message par slybreiz »

sympa pou la météo je bloque sur le scrip lua .

comment les renseigner dans domoticz il faut créé un dimmer virtuel ?
domoticz on synology dsm 6 DS109(hack DS112j) + RXFcom433E / Archos Home connecte / 4 * HC ECR-100 / Archos TBH / sonde température Alecto WS1700 / prise chacon
Répondre