[LUA] Exporter vos données vers une base MySQL

Vous avez créé 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.
Michel91
Messages : 106
Inscription : 21 avr. 2020, 15:31

Re: [LUA] Exporter vos données vers une base MySQL

Message par Michel91 »

Bonjour Keros,
Après de multiples essais j'obtiens un résultat sans erreur dans domoticz mais dans ma table phpmyadmin rien du tout.
Script LUA trigger Time

Code : Tout sélectionner

--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 
local nom_script = "export mysql"
local version = "0.10"
local debugging = true  	-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local url = "localhost/loggemulti.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="Congélateur",nom="Congélateur",canal = "1"}
les_devices[#les_devices+1] = {device="B.O.F",nom="B.O.F",canal="1"}
les_devices[#les_devices+1] = {device="Viandes",nom="Viandes",canal="1"}
les_devices[#les_devices+1] = {device="Légumes",nom="Légumes",canal="1"}
les_devices[#les_devices+1] = {device="Mise en place",nom="Mise en place",canal="1"}
--les_devices[#les_devices+1] = {device="Tem extérieure"}


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
Et ça donne dans le Log
2022-12-27 08:45:00.290 Status: LUA: <font color='#f3031d'>=========== export mysql (v0.10) ===========</font>
2022-12-27 08:45:00.290 Status: LUA: <font color='#f3031d'>--- --- --- Congelateur = -14.50</font>
2022-12-27 08:45:00.290 Status: LUA: Congelateur
2022-12-27 08:45:00.290 Status: LUA: <font color='#f3031d'>--- --- --- canal = 1</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- B.O.F = 7.25</font>
2022-12-27 08:45:00.291 Status: LUA: B.O.F
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- canal = 1</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- Viandes = 15.75</font>
2022-12-27 08:45:00.291 Status: LUA: Viandes
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- canal = 1</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- Legumes = 15.75</font>
2022-12-27 08:45:00.291 Status: LUA: Legumes
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- canal = 1</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- Mise en place = 15.25</font>
2022-12-27 08:45:00.291 Status: LUA: Mise en place
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- --- canal = 1</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- ---Envoi valeurs dans la base de données</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>curl -m5 'localhost/loggemulti.php?feeds=5&f1=Cong%C3%A9lateur&v1=-14.50&f2=B%2EO%2EF&v2=7.25&f3=Viandes&v3=15.75&f4=L%C3%A9gumes&v4=15.75&f5=Mise+en+place&v5=15.25'</font>
2022-12-27 08:45:00.291 Status: LUA: <font color='#f3031d'>--- --- ---i a une valeur de : 5</font>
2022-12-27 08:45:00.316 Status: LUA: <font color='#f3031d'>========= Fin export mysql (v0.10) =========</font>
Dernière modification par Keros le 27 déc. 2022, 10:00, modifié 1 fois.
Raison : Ajout des balises pour le code et les logs
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Exporter vos données vers une base MySQL

Message par Keros »

De ce que je comprends, le script s'appuie sur localhost/loggemulti.php pour mettre les données dans PHPmyadmin. Est-ce que ce côté là fonctionne ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Michel91
Messages : 106
Inscription : 21 avr. 2020, 15:31

Re: [LUA] Exporter vos données vers une base MySQL

Message par Michel91 »

je crois que tu as raison, mais je n'arrive pas à savoir ou ça pêche. Je t'explique mon installation.
Domoticz est sur un vps, mon serveur web est sur le même vps apache2 et les fichiers info_db.php & loggemulti.php sont dans le répertoire /var/www/html. Phpmyadmin lui est sur mon Nas synology qui est chez moi.
Et je crois que c'est là que ça coince
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Exporter vos données vers une base MySQL

Message par Keros »

A mon avis, tu dois pouvoir tester le loggemulti.php sans passer par le script DomoticZ.
Tu as bien vérifié que ton VPS pouvais accéder à ta base SQL qui est chez toi (Phpmyadmin n'est qu'une application qui permet de visualiser/éditer la base de donnée).
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Michel91
Messages : 106
Inscription : 21 avr. 2020, 15:31

Re: [LUA] Exporter vos données vers une base MySQL

Message par Michel91 »

J'ai testé loggemulti.php en direct avec une page internet et je recois "v or f is null" je pense que c'est normal donc le problème serais la liaison avec mon Nas non?
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Exporter vos données vers une base MySQL

Message par Keros »

Sauf que si v ou f est vide, cela veut dire qu'il n'y a rien à envoyer, donc la liaison php > SQL n'est pas sollicitée/testée.

Il faut mettre quelques infos dans le genre :
loggemulti.php?feeds=5&f1=Cong%C3%A9lateur&v1=-14.50&f2=B%2EO%2EF&v2=7.25&f3=Viandes&v3=15.75&f4=L%C3%A9gumes&v4=15.75&f5=Mise+en+place&v5=15.25'
Pas forcément tout. Il faut comprendre comment fonctionne loggemulti.php et peut-être lui demander d'envoyer une valeur 0 ou 1 dans une base de test.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Michel91
Messages : 106
Inscription : 21 avr. 2020, 15:31

Re: [LUA] Exporter vos données vers une base MySQL

Message par Michel91 »

Le problème que j'ai maintenant c'est de créer un dossier sur mon serveur web synology. J'ai déplacer domoticz sur le syno pour réduire les accès.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Exporter vos données vers une base MySQL

Message par Keros »

Là, je ne pourrais plus t'aider, désolé.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Michel91
Messages : 106
Inscription : 21 avr. 2020, 15:31

Re: [LUA] Exporter vos données vers une base MySQL

Message par Michel91 »

Bonjour Keros,
Après des heures de recherche je suis revenu à la config primaire, mon Nas bloquait l'adresse ip de mon domoticz, après déblocage quand j'envoie une requête du genre

http://xxx.xxx.xxxx.xxxx/loggemulti.php ... e&v5=15.25

La page affiche le contenu de mon fichier info_db.php
?php $hostname = "xxx.fr/phpmyadmin"; $db_login = "user"; $db_passw = "monmotdepasse" $db_name = "BW_Saclay"; $db_table = "cuisine"; ?>

Il doit manquer quelque chose non parce que la table est toujours vide
Répondre