Aller au contenu

Enregistrer Datas Sur Mysql Synology


mikael2235

Messages recommandés

Bonjour à  tous,

 

J'apporte ma petite contribution, pas trés compliqué, mais qui peut-être aidera certain.

L'idée, et je débute juste dans ce projet (en Z-Wave, car déjà  fait avant avec un RFXCOM), est de pouvoir enregistrer des données sur une base MySql qui est hébergé sur un serveur synology.

 

Il vous faut :

  • un module virtuel : (avec 28 l'ID de mon capteur de température, et l'IP de mon synology)
--[[
%% properties
28 value
%% globals
--]]

local timestamp = os.date("%Y%m%d%H%M%S")
local type = "Temp_Salon"
local valuetosyno = fibaro:getValue(28, "value")

fibaro:debug(timestamp)
fibaro:debug(type)
fibaro:debug(valuetosyno)

HC2 = Net.FHttp("192.168.0.2")
HC2:GET("/domotiquefibaro/fibaro_add.php?timestamp="..timestamp.."&type="..type.."&value="..valuetosyno.."")
  • une scene (avec 28 l'ID de mon capteur de temperature, et 39 l'ID de mon module virtuel) :
--[[
%% properties
28 value
%% globals
--]]

fibaro:call(39, "pressButton", "1");
  • Un syno configuré, avec PhpMyAdmin ;)
  • une base, une table configuré
  • Et une page PHP ou l'on va passer les paramètres en GET :
<?php
$timestamp = $_GET["timestamp"];
$type = $_GET["type"];
$value = $_GET["value"];

// on se connecte à  MySQL
$db = mysql_connect('localhost', 'root', 'password');

// on sélectionne la base
mysql_select_db('fibaro',$db);

// on crée la requête SQL
$sql = "INSERT INTO records(timestamp,type,value) VALUES('$timestamp','$type','$value')";

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

// on ferme la connexion à  mysql
mysql_close();
?> 

Il ne vous reste plus qu'a mettre tout ça en place, et vous pourrez recuperez dans votre base toutes les données nécessaires.

Lien vers le commentaire
Partager sur d’autres sites

J'ai choisi de façon arbitraire cette purge au bout de 21 jours pour que la volumétrie des tables n'explose pas. Et aussi surtout parce que c'est à  mon avis inutile de conserver le détail minute pas minute 2 ans plus tard... Et justement, pour avoir des statistiques à  long terme, je conserve le mini/moyen/maxi quotidien de chaque sonde dans des tables dédiées, ce qui permet de suivre la tendance à  long terme.

En fait, c'est grosso mode le principe de rrdtool, pour les connaisseurs.

 

Tu peux facilement modifier (ou supprimer) cette purge automatique après 21 jours, dans le fichier generate_trend.php

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

@mikael2235.

salut

 

je comprend pas tout

 

le code suivant je la place ou ?

 

je supose que ce code s'appelle : fibaro_add.php et qu'il faut le placer dans un fichier

<?php
$timestamp = $_GET["timestamp"];
$type = $_GET["type"];
$value = $_GET["value"];

// on se connecte à  MySQL
$db = mysql_connect('localhost', 'root', 'password');

// on sélectionne la base
mysql_select_db('fibaro',$db);

// on crée la requête SQL
$sql = "INSERT INTO records(timestamp,type,value) VALUES('$timestamp','$type','$value')";

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

// on ferme la connexion à  mysql
mysql_close();
?> 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Alors ce code doit être placé dans une page PHP que tu vas créer et mettre dans le dossier "web" de ton syno.

 

Dans PhpMyAdmin, tu vas crée une base qui s'appelle fibaro, et dans cette base une table qui s'appelle records (dans le cas de mon exemple)

-> Voir copie d'écran.

Dans mon cas j'ai deux tables, une pour les relevés de températures, et une pour les détections (changement de status de capteur présence / ouverture). Je m'en suis même servi comme "pointeuse" pour la nounou de ma fille...

 

Après en PHP, tu fais ce que tu veux, il suffit d'interroger ta base et afficher les infos que tu souhaites.

print_PMA.png

Modifié par mikael2235
Lien vers le commentaire
Partager sur d’autres sites

salut  et merci pour ton aide

 

il y quel que chose qui bloque

 

j'ai tester manuellement avec:  

pour info mon fichier PHP est INDEX.PHP

 

http://localhost:8080/domotiquefibaro/index.php?timestamp=20170413061440&type=salon&value=10

ca2.thumb.JPG.92a93e709c7a486b7a66823e2329fa60.JPG

 

il manque quel que chose a ma table 

ca1.thumb.JPG.917bed2279fd2c155f33f04bfbc723e8.JPG

 

a tu possibilité d'exporter un table pour que je cherche a comprend la chose

 

 

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

j'ai bien bataillée et je suis bloquée sur ça:

du cotée de fibaro qu'il y a un probleme 

[DEBUG] 18:50:19: 20170417185019
[DEBUG] 18:50:19: Temp_Salonsalon
[DEBUG] 18:50:19: 99
[DEBUG] 18:50:19: Result:
Forbidden
You don't have permission to access /fibaro_add.php on this server.
Apache/2.4.23 (Win64) PHP/5.6.25 Server at 192.168.0.16 Port 8080

[DEBUG] 18:50:19: Status: 403
[DEBUG] 18:50:19: Error Code: 0

pour info, ma table se met jour avec la requête HTTP 

 

http://localhost:8080/domotiquefibaro/fibaro_add.php?timestamp=20170417012013&type=terasse&value=1

 

Modifié par 971jmd
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

salut @mikael2235

 

voila le code fonctionne très bien et merci a vous ainsi qu'a @pepite et @jojo

 

mai le souci est qu'il faut passer par une scène pour cliquer sur le bouton de la VD .

 

Dans un soucis de réactivité:

y a-t-il une solution pour que chaque fois que mon module ID107 changer d’état le VD le fasse tout seul ?

 ou

 

comment faire si possible fonctionné le code directement dans une scène ?

  

 

 

--[[
%% properties
%% globals
--]]



--Récupération de l'adresse IP et du Port inscrit sur le module virtuel.
--fibaro:getSelfId() retourne l'ID du module virtuel en cours.

local ip_module = fibaro:get(fibaro:getSelfId(),"IPAddress")
local port = fibaro:get(fibaro:getSelfId(), "TCPPort")
local id_module = fibaro:getSelfId()
local status = ""
------------------------------------------------------


local deviceID = 107
----local message = fibaro:getGlobal("PAW2_VAR")

local times1 = os.date("%H%M%S")
local timestamp = os.date("%Y%m%d")





local nomdevice1 = fibaro:getName(deviceID) 
local piece1     = fibaro:getRoomName( fibaro:getRoomID(deviceID) )
------------------NOM de la SECTION-------
local SectionId = fibaro:getSectionID(deviceID) 
print("SectionId : " ..SectionId)
local json = api.get("/sections/"..SectionId)
--local section1 = ("Nom : " ..json.name)
local section1 = ("" ..json.name)
-----------------------------------------------
local val   = fibaro:getValue(deviceID, "value")

-------------------------------------------
local valuefib     = fibaro:getName(deviceID)
local powerfib     = fibaro:getValue(deviceID, "power")
---

function urlencode(str)
	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


local  payload = "/domotiquefibaro/fibaro_add.php?times="..times1.."&timestamp="..timestamp.."&nomdevice="..urlencode(tostring(nomdevice1 or "empty")).."&piece="..urlencode(tostring(piece1 or "empty")).."&section="..urlencode(tostring(section1 or "empty")).."&value="..val.."&power="..powerfib..""
 
 
HC2 = Net.FHttp(ip_module,port)
response ,status, errorCode = HC2:GET(payload)

  
  fibaro:debug("response = " .. response)
fibaro:debug("status = " .. status)
if response ~= nill and tonumber(status)==200 then
	fibaro:debug("Succes: ")
else
	fibaro:debug("Error: Failed ")
end

 

grap1.JPG

Modifié par 971jmd
Lien vers le commentaire
Partager sur d’autres sites

Tu fais la même chose dans une scene ;-) qui se declenche sur un changement de proprietes de ton mudule, sit value ET power si j'ai bien suivi.

Dans une scene, pas de FHttp, mais net.HTTPClient.

syntaxe differente que je maitrise beaucoup moins, un peu plus complexe pour moi mais il ya plein d'exemples sur le forum.

Lien vers le commentaire
Partager sur d’autres sites

salut

 

j'ai tester ça, mai rien n-y fait;)  

 

 

--[[
%% properties
107 value
107 power
%% globals
google1
--]]



--Récupération de l'adresse IP et du Port inscrit sur le module virtuel.
--fibaro:getSelfId() retourne l'ID du module virtuel en cours.

local ip_module = ("192.168.0.16")
local port = ("8080")
local status = ""
------------------------------------------------------


local deviceID = 107
----local message = fibaro:getGlobal("PAW2_VAR")

local times1 = os.date("%H%M%S")
local timestamp = os.date("%Y%m%d")





local nomdevice1 = fibaro:getName(deviceID) 
local piece1     = fibaro:getRoomName( fibaro:getRoomID(deviceID) )
------------------NOM de la SECTION-------
local SectionId = fibaro:getSectionID(deviceID) 
print("SectionId : " ..SectionId)
local json = api.get("/sections/"..SectionId)
--local section1 = ("Nom : " ..json.name)
local section1 = ("" ..json.name)
-----------------------------------------------
local val   = fibaro:getValue(deviceID, "value")

-------------------------------------------
local valuefib     = fibaro:getName(deviceID)
local powerfib     = fibaro:getValue(deviceID, "power")

---




 function urlencode(str)
	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


local  payload = "/domotiquefibaro/fibaro_add.php?times="..times1.."&timestamp="..timestamp.."&nomdevice="..urlencode(tostring(nomdevice1 or "empty")).."&piece="..urlencode(tostring(piece1 or "empty")).."&section="..urlencode(tostring(section1 or "empty")).."&value="..val.."&power="..powerfib..""
 
 
HC2 = HttpClient(ip_module,port)
response ,status, errorCode = HC2:GET(payload)

  
  fibaro:debug("response = " .. response)
fibaro:debug("status = " .. status)
if response ~= nill and tonumber(status)==200 then
	fibaro:debug("Succes: SMS envoyé")
else
	fibaro:debug("Error: Failed to SEND SMS")
end

 

Lien vers le commentaire
Partager sur d’autres sites

salut

 

j'ai tester ça 

 

local ip_module = net.HTTPClient("192.168.0.16")
http:request(url)

local ip_module = fibaro:get(fibaro:getSelfId(),"8080")
-------local port = fibaro:get(fibaro:getSelfId(), "TCPPort")
-------local id_module = fibaro:getSelfId()
--------local status = ""

résultat debug

 

[DEBUG] 12:26:50: [1;31m2017-04-30 11:56:50.961879 [ fatal] Runtime error: No matching overload found, candidates:
[DEBUG] 12:26:50: void __init(luabind::argument const&,lua_State*,custom [lua::net::HTTPOptionsGroup])
[DEBUG] 12:26:50: void __init(luabind::argument const&,lua_State*)

 

 

Lien vers le commentaire
Partager sur d’autres sites

ok j'ai fini par trouver

 

.
.
.
.
 -- http requete
   local http = net.HTTPClient()

http:request("http://192.168.0.16:8080/domotiquefibaro/fibaro_add.php?times="..times1.."&timestamp="..timestamp.."&nomdevice="..urlencode(tostring(nomdevice1 or "empty")).."&piece="..urlencode(tostring(piece1 or "empty")).."&section="..urlencode(tostring(section1 or "empty")).."&value="..val.."&power="..powerfib.."", {options = {
method = 'GET'
},
success = function(response) fibaro:debug("OK") end,
error = function(err) fibaro:debug("Error: " ..err) end
})

 

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...