Bonjour,
Voici un résumé sur la réalisation/suppression de backups via des scènes en Lua. La création/suppression de backup s'effectue en temps normal sur l'interface du HomeCenter à la page Diagnostiques/Sauvegarde et restauration.
Le code donné dons les 2 scènes n'est pas des plus optimisé; cela constitue juste une base.
EDIT (03/12/2016): Mise à jour avec l'api pour les versions >=4.101; voir plus loin: (https://www.domotique-fibaro.fr/topic/8641-backup-via-scene-lua/?do=findComment&comment=146362)
Les Commandes de l'API
La récupération au format JSON de la liste des backups se fait à l'addresse http://HC2/api/settings/backups
Pour Créer un Backup on utilise l'addresse http://HC2/api/settings/backups avec une requète de type en POST avec les paramètres action et description.
Pour Supprimer un Backup, on utilise l'addresse http://HC2/api/settings/backups?id=xx (où xx est le numéro de backup). La requète est de type DELETE avec comme paramètre id=xx
=> Comme les urls de l'api vont être appelées depuis des scènes lua, l'ip de la box utilisée sera 127.0.0.1 (port 11111)
=> En cas d'appel sur l'ip LAN de la box (Ex: http://192.168.0.100/api/settings/backups) , il faudra en plus transmettre l'authentification dans la requète.
Attention: Lors de la création de Backup, "tout le reste" est suspendu; de même après que le backup soit effectué, le moteur Z-Wave et d'autres services redémarrent. Donc en cas de planification , privilégier la nuit, là ou l'activité ZWave, scénarios, est faible/inexistante.
Scène de création d'un backup
Exemple de Scène de création d'un Backup, avec notification vers portable:
--[[
%% properties
%% events
%% globals
--]]
-- ID des mobiles,tablettes pour notification
local portable = { 385,378 }
-- Message Descriptif du Backup
local descriptif = 'Backup du '..os.date("%d/%m/%y - %HH%M")
function sendPush(message)
if #portable > 0 then
for _,v in ipairs(portable) do
fibaro:call(v,'sendPush', message)
end
end
end
local url = 'http://127.0.0.1:11111/api/settings/backups'
local httpClient = net.HTTPClient()
httpClient:request(url , {
success = function(response)
if tonumber(response.status) == 201 then
print("Backup Created at " .. os.date())
sendPush(descriptif .. ' effectué')
else
print("Error " .. response.status)
sendPush('Erreur lors de la création du Backup')
end
end,
error = function(err)
print('error = ' .. err)
end,
options = {
method = 'POST',
headers = {
["content-type"] = 'application/x-www-form-urlencoded;'
},
data = 'action=create&description='..descriptif
}
});
Depuis la page des backups, on peut vérifier que la scène fonctionne:
Pour les utilisateurs de GEA, on peut déclencher cette sauvegarde le 1er samedi de chaque mois par exemple:
-- Fonction déterminant si nous sommes le 1er samedi du mois
function isFirstSaturday()
local t = os.date('*t')
return ( t['day'] < 8 and t['wday'] == 7 )
end
-- Backup le 1er samedi du mois
GEA.add({"Function",function() return isFirstSaturday() end} , 30 , "Backup Mensuel du HC2" , {{"Time","01:00","01:01"},{"Scenario", 12}})
.
Scène de suppression d'un backup
Exemple de Scene Lua pour réaliser la suppression du backup le plus ancien:
--[[
%% properties
%% events
%% globals
--]]
-- Flag dryrun; Si true, la requete sur api pour effacer le backup n'est pas effectuée
local dryrun = true
-- Récupération de la list des backups
local backups = api.get('/settings/backups')
-- Vérification de présence Backup
if (backups and type(backups == 'table') and #backups > 0) then
if #backups > 1 then print(#backups .. ' Backups présents') else print('1 Backup présent') end
for i in ipairs(backups) do
fibaro:debug('ID: '..backups[i]['id']..' | TIMESTAMP: '..backups[i]['timestamp']..' | DESCRIPTION: '..backups[i]['description'])
end
else
print('Pas de backup ou erreur lors de la récupération de la liste')
fibaro:abort()
end
-- Pour chaque Backup on stock le timestamp de la date de réalisation dans une table
-- On classe ensuite les timestamps par ordre croissant
local timestamp = {}
for i in ipairs(backups) do
table.insert(timestamp, backups[i]['timestamp'])
end
table.sort(timestamp)
-- Le 1er timestamp de la table est le plus petit donc le plus ancien en epochtime
-- Dans la table de backup on recherche le backup ayant ce timestamp
local id = false
for i in ipairs(backups) do
if (tonumber(backups[i]['timestamp']) == tonumber(timestamp[1])) then id = backups[i]['id'] end
end
if id then
print("ID du backup le plus ancien: "..id)
else
print("Erreur lors de la récupération de l'ID")
fibaro:abort()
end
-- Requete via API pour effacer le backup le plus ancien
if not dryrun then
local url = 'http://127.0.0.1:11111/api/settings/backups?id='..id
local httpClient = net.HTTPClient()
httpClient:request(url , {
success = function(response)
if tonumber(response.status) == 200 then
print("Backup deleted at " .. os.date())
else
print("Error " .. response.status)
end
end,
error = function(err)
print('error = ' .. err)
end,
options = {
method = 'DELETE',
headers = {
["content-type"] = 'application/x-www-form-urlencoded;'
},
data = 'id='..id
}
});
end
.
Cette Scène produit le debug suivant:
Nicolas