Aller au contenu
mikael2235

Enregistrer Datas Sur Mysql Synology

Recommended Posts

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

La roue, c'était déjà toi? :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Lol, oui d'ailleurs la demande de brevet rétroactif est en cours :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Et toujours pas de nouvelles depuis le temps?

Partager ce message


Lien à poster
Partager sur d’autres sites

Non, je commence à  désespérer.... parce que je me voyais bien faire un procès au monde entier pour utilisation abusive de roues  :98:

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah désolé j'avais pas vu... je pensais que ça aurait pu etre utile.

Partager ce message


Lien à poster
Partager sur d’autres sites

Effectivement c'est pas mal et bien expliqué. Par contre c'est dommage de devoir purger les données tous les 21 jours. J'ai 6 millions de lignes dans ma table de relevés.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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();
?> 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

je pense que la premier des chose est de crée la table

 

msql1.JPG.a8e30b558289a057af1def4f513dbb4b.JPG

Partager ce message


Lien à poster
Partager sur d’autres sites

@mikael2235

 

salut

 

j'ai quel que soucie avec la création de la base MSQL

 

aurait tu  quel que captures d’écran 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

 

 

 

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

pour info je suis sur WAMPSERVEUR 3.0.6

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Heu normal, la syntaxe c'est plutôt : 

 

http= net.HTTPClient()

http:request(url)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci je vais tester


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
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*)

 

 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

je confirme ça fonctionne 

 

merci a vous

Partager ce message


Lien à poster
Partager sur d’autres sites

×