Sauvegarde et exportation des scripts LUA de la DB

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
53l3cu5
Messages : 31
Inscription : 09 juil. 2021, 19:47

Sauvegarde et exportation des scripts LUA de la DB

Message par 53l3cu5 »

Bonjour à tous,
C'est mon premier post ici.

Je cherche à sauvegarder régulièrement les scripts LUA, pas ceux dans les dossiers, mais dans la base de donné pendant que je développe.

Pour l'instant, j'arrive à exporter et à sauvegarder mes scripts manuellement.
cd /home/pi/domoticz
sqlite3 domoticz.db
sqlite> .separator |
sqlite> .output sauvegarde.txt
sqlite> select * from EventMaster;
sqlite> .exit
Mais j'aimerai faire une sauvegarde quotidienne de la base. Et tant que possible dans un fichier diffèrent tout les jours.
Merci d'avance
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par denis_brasseur »

Voici le script que j'utilise, script de type time.
Il te faut évidemment adapter les chemins à ta configuration.

Code : Tout sélectionner

commandArray = {}
function SaveTable(matable,sortie)
    Path="/home/pi/domoticz/"
    dbPath="/home/pi/domoticz/domoticz.db"
    if sortie == nil then sortie = 'sortie.txt' end
    sql='sqlite3 -header -csv '..dbPath..' "select * from '..matable..';" > '..Path..sortie
    os.capture(sql)
    os.execute("chown pi "..Path..sortie)
end

if time.hour==5 and time.min==1 then
    -- retourne le jour sur 2 car ex: "29"
    jour = os.date("%d")
    SaveTable('EventMaster', 'scripts/lua/logs/Event_'..jour..'.txt')
end

return commandArray

Capture.PNG
Capture.PNG (35.64 Kio) Consulté 3078 fois
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Message par hestia »

voici mon script (issu du forum anglais)

Code : Tout sélectionner

#!/bin/bash
#
# dump all dzVents to separate files
#
# change to reflect your situation / requirements
#
# from: https://www.domoticz.com/forum/viewtopic.php?f=31&t=28627&p=218924&hilit=save+file+lua#p218924

domoticzDir='/home/pi/PROD_domoticz/'
scriptDir='/home/pi/mydomoticz/myscripts/dzVents/'

# no changes required below this line
#
#mkdir -p $scriptDir
sudo cp $domoticzDir/domoticz.db /tmp/tmp.db 

sudo sqlite3 /tmp/tmp.db "select ID, name,status from eventMaster WHERE interpreter = 'dzVents'" | while read line;
do
	#echo "line:" $line
	ID=$(echo $line | awk -F'|' '{ print $1 }')
	#echo "ID " $ID

	NAME=$(echo $line | awk -F'|' '{ print $2 }')
	#echo "NAME " $NAME

	STATUS=$(echo $line | awk -F'|' '{ print $3 }')
	#echo "STATUS" $STATUS


	if [[ $STATUS == 0 ]] ; then # script inactive
	        scriptDirName=$scriptDir$NAME'.inactive.lua'
        else
        	scriptDirName=$scriptDir$NAME'.lua'
        fi

	sudo sqlite3 /tmp/tmp.db "select XMLSTatement from eventMaster WHERE interpreter = 'dzVents' and ID = $ID" > $scriptDirName
	echo "export " $NAME " to " $scriptDirName 
done
sudo rm /tmp/tmp.db
il est pour dZvents, mais adaptable facilement (le pense) pour LUA en changeant

Code : Tout sélectionner

interpreter = 'dzVents' 
par ce qu'il faut...
La sortie, un fichier par script, avec les scripts inactifs avec une extension .inactive

Code : Tout sélectionner

-rw-r--r-- 1 pi pi  9163 Dec 18  2020 AlerteMoustiques.lua
-rw-r--r-- 1 pi pi 10014 Jul 15 00:05 AlerteMoustiques_V1R0.lua
-rw-r--r-- 1 pi pi  1893 Jul 15 00:05 Aqua_Icones.inactive.lua
-rw-r--r-- 1 pi pi  2393 Jul 15 00:05 AquaMeters.lua
-rw-r--r-- 1 pi pi  4093 Jul 11 00:05 aquaOnOff.lua
-rw-r--r-- 1 pi pi  4205 Jul 15 00:05 AquaOnOff.lua
-rw-r--r-- 1 pi pi  2577 Jul 15 00:05 AquaOnOffPump.lua
-rw-r--r-- 1 pi pi  4480 Jul 15 00:05 AquaVolume.lua
-rw-r--r-- 1 pi pi  1530 Jul 15 00:05 aTestDimTo0.inactive.lua
-rw-r--r-- 1 pi pi 11537 Sep 20  2020 Auto_off.inactive.lua
-rw-r--r-- 1 pi pi 50834 Dec 11  2020 AutoOff_Notif.inactive.lua
Je ne RAZ pas le répertoire de sortie avant l'export, comme cela je garde les anciennes versions pour peu que je mette la version dans le nom du script
le cron

Code : Tout sélectionner

# export dzvents scripts
5 0  * * * /home/pi/mydomoticz/myscripts/export_dzVent.sh 2>&1 | /usr/bin/logger                                           -t DZBACKUP
53l3cu5
Messages : 31
Inscription : 09 juil. 2021, 19:47

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par 53l3cu5 »

denis_brasseur a écrit : 15 juil. 2021, 04:59

Code : Tout sélectionner

commandArray = {}
function SaveTable(matable,sortie)
    Path="/home/pi/domoticz/"
    dbPath="/home/pi/domoticz/domoticz.db"
    if sortie == nil then sortie = 'sortie.txt' end
    sql='sqlite3 -header -csv '..dbPath..' "select * from '..matable..';" > '..Path..sortie
    os.capture(sql)
    os.execute("chown pi "..Path..sortie)
end

if time.hour==5 and time.min==1 then
    -- retourne le jour sur 2 car ex: "29"
    jour = os.date("%d")
    SaveTable('EventMaster', 'scripts/lua/logs/Event_'..jour..'.txt')
end

return commandArray

Merci Denis Je vais tester ça tout de suite !
hestia a écrit : 15 juil. 2021, 17:05 voici mon script (issu du forum anglais)

Code : Tout sélectionner

#!/bin/bash
#
# dump all dzVents to separate files
#
# change to reflect your situation / requirements
#
# from: https://www.domoticz.com/forum/viewtopic.php?f=31&t=28627&p=218924&hilit=save+file+lua#p218924

domoticzDir='/home/pi/PROD_domoticz/'
scriptDir='/home/pi/mydomoticz/myscripts/dzVents/'

# no changes required below this line
#
#mkdir -p $scriptDir
sudo cp $domoticzDir/domoticz.db /tmp/tmp.db 

sudo sqlite3 /tmp/tmp.db "select ID, name,status from eventMaster WHERE interpreter = 'dzVents'" | while read line;
do
	#echo "line:" $line
	ID=$(echo $line | awk -F'|' '{ print $1 }')
	#echo "ID " $ID

	NAME=$(echo $line | awk -F'|' '{ print $2 }')
	#echo "NAME " $NAME

	STATUS=$(echo $line | awk -F'|' '{ print $3 }')
	#echo "STATUS" $STATUS


	if [[ $STATUS == 0 ]] ; then # script inactive
	        scriptDirName=$scriptDir$NAME'.inactive.lua'
        else
        	scriptDirName=$scriptDir$NAME'.lua'
        fi

	sudo sqlite3 /tmp/tmp.db "select XMLSTatement from eventMaster WHERE interpreter = 'dzVents' and ID = $ID" > $scriptDirName
	echo "export " $NAME " to " $scriptDirName 
done
sudo rm /tmp/tmp.db
Merci à toi aussi hestia ! Je ne connais pas le langage que tu utilises mais le script à l'air très complet.
Si je réussi à faire un mélange de vos deux scripts je viendrais poster le résultat ici

Merci beaucoup à vous deux
hestia
Messages : 397
Inscription : 12 sept. 2018, 22:36

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par hestia »

Je ne connais pas le langage que tu utilises
C'est du script shell à faire sur linux directement

Pour avoir les LUA, je dirai qu'il faut mettre 'Lua' à la place de 'dzVents' dans WHERE interpreter = 'dzVents'
53l3cu5
Messages : 31
Inscription : 09 juil. 2021, 19:47

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par 53l3cu5 »

Merci pour le renseignement. Je saurais quoi chercher quand j'en aurais besoin.

Et voici le résultat du mixe de vos deux scripts

Code : Tout sélectionner

commandArray = {}

function mysplit (inputstr, sep)
    if sep == nil then sep = "%s" end
    local t={}
    for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
        table.insert(t, str)
    end
    return t
end

function os.capture(cmd)
  local f = assert(io.popen(cmd, 'r'))
  local s = assert(f:read('*a'))
  f:close()
  return s
end

function SaveTable(dbPath, matable, sortie)
    local sql1='sqlite3 '..dbPath..' "select ID, name,status from '..matable..';"'
    local result = os.capture(sql1)
    local lignes = mysplit(result, '\n\r')
    for i=1,#lignes,1 do
        splited = mysplit(lignes[i], '|')
        id = splited[1]
        name = splited[2]
        status = splited[3]
        if status == '0' then
            scriptDirName = sortie .. name ..'.inactive.lua'
        else
            scriptDirName = sortie .. name ..'.active.lua'
        end
        sql2 = 'sqlite3 ' .. dbPath .. ' "select XMLSTatement from '..matable..' WHERE ID = ' .. id .. '" > "' .. scriptDirName .. '"'
        os.execute(sql2)
        os.execute('chown pi "'..scriptDirName .. '"')
    end
    print("Les scripts LUA ont été sauvé")
end

Timer = os.date('%H:%M')
if Timer == '05:01' then
    -- retourne le jour de l'année ex: "365"
    jour = os.date("%j")
    SaveTable('/home/pi/domoticz/domoticz.db', 'EventMaster', '/home/pi/domoticz/scripts/lua/logs/'..jour..'_')
end

return commandArray
Ce qui donne ça
Sans titre-1.png
Sans titre-1.png (169.81 Kio) Consulté 3002 fois

Encore un grand merci à vous deux !
Dernière modification par Keros le 19 juil. 2021, 16:52, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse directe
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par denis_brasseur »

Beau travail, marche nickel :)
Dernière modification par Keros le 19 juil. 2021, 16:53, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse directe
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par Doudy »

Hello,
C'est pour dzvents et lua ?
;)
Dernière modification par Keros le 19 juil. 2021, 16:53, modifié 1 fois.
Raison : Suppression de la citation du message
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par denis_brasseur »

Le script de 53l3cu5 va sauvegarder l'ensemble des scripts de la base de données, quelque en soit le type, blockly, python, lua et dzvents.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: Sauvegarde et exportation des scripts LUA de la DB

Message par Doudy »

👍

C'est un script en LUA, je suppose :?
Mais script_time_x c'est toutes les minutes !
Et script_device_x attend une modification d'un device !

Comment démarrer ce script ?
:oops:
Dernière modification par Keros le 19 juil. 2021, 16:51, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse directe
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Répondre