LUA : exporter vos données vers une base MySQL

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
papoo
Messages : 966
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

LUA : exporter vos données vers une base MySQL

Messagepar papoo » 26 nov. 2017, 13:13

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 vers une base mysql afin de pouvoir générer des graphiques en local via highstock (ce qui fait l'objet d'un autre post).
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 article pour la box vera.
je réutilise en parti les fichiers de cet article, notamment ceux servant à l'affichage des graphiques.
les pré-requis :
un serveur web supportant le php ainsi qu'un serveur mysql (ou mariaDB pour les possesseurs de nas synology) si vous n'en disposez pas, vous trouverez facilement des tuto sur le web pour cela.
Le fichier script_time_export_mysql.lua :

Code : Tout sélectionner

--[[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
http://pon.fr/exporter-des-donnees-vers-mysql/
]]--

--------------------------------------------
------------ 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

créez un répertoire mesgraphs sur votre serveur web et collez les fichiers loggemulti.php

Code : Tout sélectionner

<?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";
?>
et info_db.php contenant les parametres d'accès à votre base de données :

Code : Tout sélectionner

<?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)

Code : Tout sélectionner

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;

ce qui donne sous phpmyadmin une fois que cela fonctionne :
2017-11-19 13_24_12-192.168.1.25 _ MariaDB 10 _ graph _ graph_tbl _ phpMyAdmin 4.6.6.png
2017-11-19 13_24_12-192.168.1.25 _ MariaDB 10 _ graph _ graph_tbl _ phpMyAdmin 4.6.6.png (35.35 Kio) Consulté 454 fois
domoticz beta/RaspBerry PI3 jessie
http://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Gaz
Messages : 178
Inscription : 17 oct. 2015, 10:30

Re: LUA : exporter vos données vers une base MySQL

Messagepar Gaz » 02 janv. 2018, 21:15

Super merci beaucoup pour ce script qui fonctionne comme d'habitude du premier coup.
En revanche j'arrive pas à faire enregistrer les données de mes sondes Oregon ( temp + hygrométrie ) ! Aurais tu la syntaxe,
J'ai testé avec :

les_devices[#les_devices+1] = {device="Grenier", nom="Grenier", canal="1"}
les_devices[#les_devices+1] = {device="Grenier"(Temp + Humidity), nom="Grenier", canal="1"}
les_devices[#les_devices+1] = {device="Grenier (Temp + Humidity)", nom="Grenier", canal="1"}
les_devices[#les_devices+1] = {device="Grenier (Temp)", nom="Grenier", canal="1"}
etc...idem pour les canaux..et pour les compteurs de type incrémental.

Dans les long voici le message d'erreur :
2018-01-02 21:12:00.457 Error: EventSystem: in script_time_export_mysql: [string "--[[..."]:126: attempt to concatenate global 'v' (a nil value)

Merci d'avance.

papoo
Messages : 966
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : exporter vos données vers une base MySQL

Messagepar papoo » 02 janv. 2018, 21:37

en ligne 126 tu tente d'afficher le canal que tu as défini.

Code : Tout sélectionner

voir_les_logs("--- --- --- ".. sans_accent(d.device) .." = "..(v or "nil"),debugging)

tu as du ne pas remplir un champs device dans le tableaux les_devices si ce n'est pas le cas c'est donc un device qui ne retourne pas de valeur
commente l'ensemble des lignes du tableau les_devices puis decommente les une à une histoire d'identifier le device incompatible

pour ma sonde oregon exterieure elle m'affiche cela dans les log
2018-01-02 21_30_09-Domoticz.png
2018-01-02 21_30_09-Domoticz.png (8.28 Kio) Consulté 248 fois

ce qui donne ça dans la config

Code : Tout sélectionner

les_devices[#les_devices+1] = {device="Temperature exterieure", nom="Temperature exterieure", canal=1}
les_devices[#les_devices+1] = {device="Temperature exterieure", nom="Humidité exterieure", canal=2}

donc dans ton exemple il faudrait mettre

Code : Tout sélectionner

les_devices[#les_devices+1] = {device="Grenier"(Temp + Humidity), nom="Température Grenier", canal="1"}
les_devices[#les_devices+1] = {device="Grenier (Temp + Humidity)", nom="Humidité Grenier", canal="2"}

je n'ai pas de compteur de type incrémental, je vais tenter d'en créer un pour voir comment extraire les données
domoticz beta/RaspBerry PI3 jessie
http://pon.fr github

Gaz
Messages : 178
Inscription : 17 oct. 2015, 10:30

Re: LUA : exporter vos données vers une base MySQL

Messagepar Gaz » 02 janv. 2018, 22:36

Rapide le papoo.
Super, j'avais vraiment pas compris ton explication, effectivement cela fonctionne parfaitement.
Pour aider la syntaxe exacte est celle ci :

Code : Tout sélectionner

les_devices[#les_devices+1] = {device=XXXX", nom="XXXX", canal=1}
les_devices[#les_devices+1] = {device="XXXX", nom="XXXX", canal=2}


Pour le compteur incrémental j'utilise cela pour faire des tests rapides :

Code : Tout sélectionner

http://192.168.X.XX:XXXX/json.htm?type=command&param=udevice&idx=XXXX&svalue=1


Encore MERCI

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


papoo
Messages : 966
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : exporter vos données vers une base MySQL

Messagepar papoo » 03 janv. 2018, 20:19

je viens de tester avec un compteur incremental cela fonctionne sans problème
2018-01-03 20_15_18-Domoticz.png
2018-01-03 20_15_18-Domoticz.png (14.24 Kio) Consulté 202 fois
domoticz beta/RaspBerry PI3 jessie
http://pon.fr github

Gaz
Messages : 178
Inscription : 17 oct. 2015, 10:30

Re: LUA : exporter vos données vers une base MySQL

Messagepar Gaz » 06 janv. 2018, 11:05

Fonctionne aussi.
Merci bien.

thuglife
Messages : 29
Inscription : 28 janv. 2017, 23:08

Re: LUA : exporter vos données vers une base MySQL

Messagepar thuglife » 13 janv. 2018, 13:28

Quelqu'un peux m'aider, j’essaie d'écrire dans la sql de free mais j'ai ce message dans les logs :

Code : Tout sélectionner

 2018-01-13 13:25:00.558 LUA: --- --- ---Envoi valeurs dans la base de données
2018-01-13 13:25:00.558 LUA: curl -m5 'http://henri.dupont.free.fr/mesgraphs/loggermulti.php?feeds=14&f1=Temp+Exterieure&v1=13.1&f2=Temp+Cuisine&v2=21.7&f3=Hygro+Cuisine&v3=44&f4=Temp+Salon&v4=22.6&f5=Hygro+Salon&v5=41&f6=Temp+SDB&v6=19.7&f7=Hygro+SDB&v7=49&f8=Temp+Chambre&v8=19.3&f9=Hygro+Chambre&v9=49&f10=Temp+Cave&v10=11.6&f11=Hygro+Cave&v11=63&f12=Puissance&v12=398568.361&f13=HP&v13=550257.201&f14=HC&v14=0'
2018-01-13 13:25:00.558 LUA: --- --- ---i a une valeur de : 14
2018-01-13 13:25:00.758 LUA: ========= Fin ExportMySQL (v0.20) =========


Mon infodb :

Code : Tout sélectionner

<?php
$hostname = "henri.dupont.free.fr";
$db_name  = "henri_dupont";
$db_table = "graph_tbl";
$db_login = "henri.dupont";
$db_passw = "monpass"
?>
Dernière édition par thuglife le 13 janv. 2018, 14:08, édité 1 fois.

papoo
Messages : 966
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : exporter vos données vers une base MySQL

Messagepar papoo » 13 janv. 2018, 13:35

quand tu lances directement l'url depuis ton navigateur arrives tu à accéder à ta page infodb ?

moi quand je la lance http://henri.dupont.free.fr/mesgraphs/i ... 4=HC&v14=0

j'ai ce retour

Ce site est inaccessible
Impossible de trouver l'adresse IP du serveur de henri.dupont.free.fr.
Accédez à http://free.fr/
Effectuez une recherche Google sur henri dupont free fr mesgraphs info.
ERR_NAME_NOT_RESOLVED
domoticz beta/RaspBerry PI3 jessie
http://pon.fr github

thuglife
Messages : 29
Inscription : 28 janv. 2017, 23:08

Re: LUA : exporter vos données vers une base MySQL

Messagepar thuglife » 13 janv. 2018, 14:10

Henri dupont est un nom que j'ai mis pour ne pas mettre le mien, quand je fais :

http://lhenri.dupont.free.fr/mesgraphs/ ... =HC&v14=0'

J'ai en retour :

Warning: mysql_select_db() [function.mysql-select-db]: A link to the server could not be established in /mnt/132/sdb/b/9/henri.dupont/mesgraphs/loggermulti.php on line 11
Erreur SQL !

papoo
Messages : 966
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : exporter vos données vers une base MySQL

Messagepar papoo » 13 janv. 2018, 14:20

il n'y aurait pas un port spécifique pour le sql de free?
domoticz beta/RaspBerry PI3 jessie
http://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.



Revenir vers « La Bibliothèque Scripts et Tutos »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 10 invités