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 --[[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 ("".. s .."") else print ("aucune valeur affichable") 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]'.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 !
'.mysql_error()); echo "OK"; ?>[/code] et info_db.php contenant les parametres d'accès à votre base de données : [code]

pour la table sql (via phpmyadmin)

CREATE TABLE `graph_tbl` (
  `ffeed` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `ftimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fvalue` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

 '.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."),";
	}
} */
$sql = "SELECT DISTINCT ffeed FROM ".$db_table." ORDER BY ffeed ASC";
$req = mysql_query($sql, $db) or die('Erreur SQL !
'.mysql_error()); // on recupere le resultat sous forme d'un tableau //$data = mysql_fetch_array($req); ?> Graphiques

Sélectionner les graphiques à afficher




"; ?>


Le contenu du fichier form.css


form {
  /* Just to center the form on the page */
  margin: 0 auto;
  width: 500px;

  /* To see the limits of the form */
  padding: 1em;
  border: 1px solid #CCC;
  border-radius: 1em;
}

div + div {
  margin-top: 1em;
} 

label {
  /* To make sure that all label have the same size and are properly align */
  display: inline-block;
  width: 180px;
  text-align: left;
  color: #663399; /* Colorer en bleu tous les labels (bah oui, pourquoi pas en bleu ?) */
    font-weight: bold ;
}
H2{
  /* To make sure that all label have the same size and are properly align */
  display: inline-block;
  width: 500px;
  text-align: center;
  color: #663399; /* Colorer en bleu tous les labels (bah oui, pourquoi pas en bleu ?) */
  
}
input, textarea {
  /* To make sure that all text field have the same font settings
     By default, textarea are set with a monospace font */
  font: 1em sans-serif;

  /* To give the same size to all text field */
  width: 180px;

  -moz-box-sizing: border-box;
       box-sizing: border-box;

  /* To harmonize the look & feel of text field border */
  border: 1px solid #999;
}

input:focus, textarea:focus {
  /* To give a little highligh on active elements */
  border-color: #000;
}

textarea {
  /* To properly align multiline text field with their label */
  vertical-align: top;

  /* To give enough room to type some text */
  height: 5em;

  /* To allow users to resize any textarea vertically
     It works only on Chrome, Firefox and Safari */
  resize: vertical;
}

.button {
  /* To position the buttons to the same position of the text fields */
  padding-left: 90px; /* same size as the label elements */
}

button {
  /* This extra magin represent the same space as the space between
     the labels and their text fields */
  margin-left: .5em;
}

/* color: #663399; 
font-weight: bold;
font-size:24px;
} */

/* Mettre une séparation entre les fieldset et colorer l'arrière plan */
body {
  background: #848484;
  color: #111111;
/*   font-family: Georgia, "Times New Roman", Times, serif;
  padding: 20px; */
}

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

2 thoughts on “Exporter des données vers MySql

  1. bonjour
    j’ai eu quelques difficultées a faire tourner ca sur un synology DSM 6 en php 5.6 parce que les fonctions mysql sont « deprecated » j’ai du remplacer par les fonctions mysqli.
    a part ca all is fine
    les graphiques sont pas mal .

    une amelioration a prevoir un bouton pour tout (de)selectionner
    good work

Laisser un commentaire