Exporter des données vers MySql

Bonjour, sur le même principe que le script pour exporter les données vers ThingSpeak ou emoncms voici un script Lua pour exporter vos données domoticz vers une base mysql afin de pouvoir générer des graphiques en local via highstock
l’intérêt est de pouvoir superposer les graphiques de plusieurs sondes, choisir simplement la période à afficher, activer ou désactiver dynamiquement les données de devices sans recharger le graphique.

je me suis basé sur un

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
--[[script_time_export_mysql.lua
auteur : papoo
 
maj : 23/11/2017
date : 01/11/2017
Principe :
exporter les données de compteurs, Températures, etc.. sur une base de données de type MySql
Le script est lu toutes les minutes mais n'exporte les données que toutes les 15 minutes
http://easydomoticz.com/forum/viewtopic.php?f=17&t=5368
/
]]--
 
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local nom_script = "export mysql"
local version = "0.10"
local debugging = false   -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local url = "http://192.168.1.250/mesgraphs/loggermulti.php"
 
local les_devices = {};
-- si vous souhaitez remonter les valeurs d'un device qui en comporte plusieurs (ex: température et hygrometrie extérieure)
-- renseigner le nom de la valeur à remonter (à partir de la deuxieme valeur) ainsi que le numero d'ordre dans canal (voir exemples ci dessous Puissance Lave Linge et Puissance Sèche Linge )
les_devices[#les_devices+1] = {device="Compteur Eau Chaude", nom="Cpt Eau Chaude", canal="1"}
les_devices[#les_devices+1] = {device="Compteur Eau Froide", nom="Cpt Eau Froide", canal="1"}
les_devices[#les_devices+1] = {device="Compteur Gaz", nom="Cpt Gaz", canal="1"}
les_devices[#les_devices+1] = {device="Compteur Lumières", nom="Cpt lumieres", canal=""}
les_devices[#les_devices+1] = {device="Compteur Prises", nom="Cpt prises", canal=""}
les_devices[#les_devices+1] = {device="Compteur Technique", nom="Cpt technique", canal=""}
les_devices[#les_devices+1] = {device="EDF", nom="edf", canal="2"}
les_devices[#les_devices+1] = {device="Frigo (Consommation)", nom="Frigo", canal="1"}
les_devices[#les_devices+1] = {device="Lave Linge (Consommation)", nom="Lave Linge", canal="1"}
les_devices[#les_devices+1] = {device="Frigo (Consommation)", nom="Puissance Frigo", canal="2"}
les_devices[#les_devices+1] = {device="Lave Linge (Consommation)", nom="Puissance Lave Linge", canal="2"}
les_devices[#les_devices+1] = {device="Sèche Linge (Consommation)", nom="Puissance Sèche Linge", canal="2"}
les_devices[#les_devices+1] = {device="EDF", nom="Puissance Totale", canal="1"}
les_devices[#les_devices+1] = {device="Sèche Linge (Consommation)", nom="Sèche Linge", canal="1"}
les_devices[#les_devices+1] = {device="Temperature Bureau", nom="temp bureau", canal="1"}
les_devices[#les_devices+1] = {device="Temperature Cuisine", nom="temp cuisine", canal="1"}
les_devices[#les_devices+1] = {device="Temperature départ chauffage", nom="temp départ chauffage", canal="1"}
les_devices[#les_devices+1] = {device="Temperature Entree", nom="temp entree", canal="1"}
les_devices[#les_devices+1] = {device="Temperature retour chauffage", nom="temp retour chauffage", canal="1"}
les_devices[#les_devices+1] = {device="Temperature Salon", nom="temp salon", canal="1"}
 
local feeds =""
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
 
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------
 
function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then
if s ~= nil then
        print ("<font color='#f3031d'>".. s .."</font>")
else
print ("<font color='#f3031d'>aucune valeur affichable</font>")
end
    end
end -- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
--==============================================================================================
 
function sans_accent(str) -- supprime les accents de la chaîne str
    if (str) then
str = string.gsub (str,"Ç", "C")
str = string.gsub (str,"ç", "c")
    str = string.gsub (str,"[-èéêë']+", "e")
str = string.gsub (str,"[-ÈÉÊË']+", "E")
    str = string.gsub (str,"[-àáâãäå']+", "a")
    str = string.gsub (str,"[-@ÀÁÂÃÄÅ']+", "A")
    str = string.gsub (str,"[-ìíîï']+", "i")
    str = string.gsub (str,"[-ÌÍÎÏ']+", "I")
    str = string.gsub (str,"[-ðòóôõö']+", "o")
    str = string.gsub (str,"[-ÒÓÔÕÖ']+", "O")
    str = string.gsub (str,"[-ùúûü']+", "u")
    str = string.gsub (str,"[-ÙÚÛÜ']+", "U")
    str = string.gsub (str,"[-ýÿ']+", "y")
    str = string.gsub (str,"Ý", "Y")
     end
    return (str)
end
--==============================================================================================
function urlencode(str) -- encode la chaine str pour la passer dans une url
    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
--==============================================================================================
function split(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end -- usage : valeurs = split(variable,";")
--==============================================================================================
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
 
commandArray = {}
time=os.date("*t")
--if ((time.min-1) % 2) == 0 then  -- export des données toutes les 2 minutes
if ((time.min-1) % 15) == 0 then  -- export des données toutes les 15 minutes
voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
 
 
    for i,d in ipairs(les_devices) do
        v=otherdevices[d.device]
c=tonumber(d.canal)
voir_les_logs("--- --- --- ".. sans_accent(d.device) .." = "..(v or "nil"),debugging)
            print(sans_accent(d.device))
voir_les_logs("--- --- --- canal = "..(c or "nil"),debugging)
if v~= nil then v,nbCommas=string.gsub(v,";",";") end-- verification de la presence d'un ou plusieurs point virgule => valeurs multiples
   if nbCommas >= 1 and c ~= nil then
voir_les_logs("--- --- --- valeurs multiples dans ".. sans_accent(d.device) .." = ".. v,debugging)
voir_les_logs("--- --- ---  Nb de point virgule = "..(nbCommas or "nil"),debugging)
local valeurs = split(v,";")
voir_les_logs("--- --- ---  valeur 1 = "..(valeurs[1] or "nil"),debugging)
voir_les_logs("--- --- ---  valeur 2 = "..(valeurs[2] or "nil"),debugging)
voir_les_logs("--- --- ---  valeur 3 = "..(valeurs[3] or "nil"),debugging)
voir_les_logs("--- --- ---  valeur 4 = "..(valeurs[4] or "nil"),debugging)
feeds = feeds .. '&f'.. i .. '=' .. urlencode(d.nom) .. '&v' .. i .. '=' .. valeurs[c]
elseif d.nom ~= nil then
feeds = feeds .. '&f'.. i.. '=' .. urlencode(d.nom) .. '&v' .. i .. '=' .. v
        else
        feeds = feeds .. '&f'.. i.. '=' .. urlencode(d.device) .. '&v' .. i .. '=' .. v
end
    I = i    
end
 
        feeds = string.gsub (feeds, ".000", "")
  
    url = url .. "?feeds=" .. I
    voir_les_logs("--- --- ---Envoi valeurs dans la base de données",debugging)
    voir_les_logs("curl -m5 " .. "'".. url .. feeds .."'",debugging)
    voir_les_logs("--- --- ---i a une valeur de : "..I,debugging)
os.execute("curl -m5 " .. "'".. url .. feeds .."'")
 
voir_les_logs("========= Fin ".. nom_script .." (v".. version ..") =========",debugging)
end -- if time
-- ============================================================================
return commandArray[/code]
créez un répertoire mesgraphs sur votre serveur web et collez les fichiers loggemulti.php
[code]<?php
//loggemulti.php
include("info_db.php");
 
if (!isset($_GET['f1']) || !isset($_GET['v1']))
    die ("v or f is null");
 
$feeds = $_GET['feeds'];
 
$db = mysql_connect($hostname, $db_login, $db_passw);
mysql_select_db($db_name, $db) or die('Erreur SQL !<br>'.mysql_error());
$sql = "INSERT INTO ".$db_table." (ffeed, fvalue) VALUES";
for($i=1;$i<=$feeds;$i++){
$feed = $_GET['f'.$i];
$value = $_GET['v'.$i];
if ($i==$feeds){
$sql.=" (\"".$feed."\", ".$value.")";
} else {
$sql.=" (\"".$feed."\", ".$value."),";
}
}
echo "$sql";
mysql_query($sql, $db) or die('Erreur SQL !<br>'.mysql_error());
echo "OK";
?>[/code] et info_db.php contenant les parametres d'accès à votre base de données :
[code]<?php
$hostname = "192.168.1.250:3307";
$db_name  = "graph";
$db_table = "graph_tbl";
$db_login = "login";
$db_passw = "passw"
?>

pour la table sql (via phpmyadmin)

passons maintenant à leurs mise en forme et exploitation.
pour cela il vous faut décompresser
ce fichier zip sur votre serveur web .
Le fichier info_db.php est à personnaliser avec les informations de votre base de données adresse:port, login et mot de passe notamment.
ensuite lancez le fichier feeds.php qui va vous permettre de lister les données contenues dans votre base de données et afficher celles que vous désirez via un formulaire tout simple dont vous pourrez modifier le style via le fichier form.css.
le contenu du fichier feeds.php

Le contenu du fichier form.css

vous devriez obtenir un résultat similaire à celui la.
Pour le CSS du formulaire je ne me suis pas foulé, n’hésitez pas à me proposer votre travail si vous l’améliorez.

validez le formulaire et vous obtiendrez l’affichage de vos données similaires à mes températures départ et retour chauffage

le github