=> publication d'une version 2.0 plus efficace, plus simple et avec un meilleur debug + commentaires en français
Le principe de ce bout de code est le suivant : simuler une présence dans votre logement en s'appuyant sur votre mode de vie des mêmes journées les précédentes semaines. Le programme analyse le comportement des lumières des 2 dernières semaines (à partir de l'historique de consommation) et simule par réplication une vraie vie (la vôtre !) dans votre logement.
3 prérequis :
- il est nécessaire de vérifier que les modules de type lampe sont bien déclarés comme lampe. Pour cela il faut aller dans la configuration avancée des modules concernées et sélectionner dans appareil commandé : Eclairage ou Lampe de chevet ou Lampe de jardin,....
- ajouter pour les modules qui le permettent le suivi de la consommation électrique (attention, il faudra attendre au moins 2-3 semaines que cela soit efficace)
- créer une variable globale "Simu_presence" avec comme possibilité ON ou OFF
Le code ci-dessous peut être placé dans la boucle principale dans un module virtuel. En pièce jointe le module à importer.
-----------------------
-- fonction d'arrondi --
------------------------
function math.round(num, idp)
return tonumber(string.format("%."..idp.."f", num ));
end
--------------------
-- Debug function --
--------------------
function Debug(message, color)
if (color == nil) then color = "white";end;
fibaro:debug(string.format("<font color=" .. color .. ">" .. message .. "</font>"));
return;
end
------------------------------------------------------------------------------------------------------------------
-- Fonction de récupération de l'historique de l'allumage d'une lampe --
------------------------------------------------------------------------------------------------------------------
local function CollecteStatus(DureeHistorique, Device)
local TimeStart = DureeHistorique + 300; -- à la date de l'historique plus 5 min
local TimeEnd = DureeHistorique - 300; -- à la date de l'historique moins 5 min
-- init tableaux et variables
local TabMeasure = {}; -- tableau de mesures timestamp/activité
local HC2 = Net.FHttp("127.0.0.1",11111);
if (Device ~= nil) then
Response, status, errorCode = HC2:GET("/api/energy/now-" .. TimeStart .. "/now-" .. TimeEnd .. "/summary-graph/devices/power/" .. Device);
end;
if (tonumber(errorCode)==0 and tonumber(status)==200)
then
TabMeasure = json.decode(Response); -- chargement des données dans une table
Debug("Nb mesures : " .. table.getn(TabMeasure) .. " (historique il y a " .. DureeHistorique/86400 .. " jours)","yellow");
local State = 0;
-- scan la période concernée les semaines précédente
for i = 1, table.getn(TabMeasure) do
local Heure = tonumber(TabMeasure[i][1])/1000; -- collecte de l'heure et conversion des millisecondes en secondes
if (tonumber(TabMeasure[i][2]) > 0) -- il y a une activité
then
State = 1;
end
Debug("Mesure " .. i .. " : " .. os.date("%A %d/%m/%y %H:%M",Heure) .. " => " .. State);
end
return State; -- retour de la fonction
else
Debug("fail : ".. status .. " - error : ".. errorCode);
end
end
-- Scan de tous les devices si alarme active
if (fibaro:getGlobalValue("Simu_presence") == "ON")
then
Debug("START REPLICATOR....");
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 1062);
fibaro:log('Simulation active');
Debug("Alarme active => Scan....");
for device=1, 1000, 1 do
if (fibaro:getValue(device, "isLight") == '1') -- si type lampe
then
-- lancement de la fonction de collecte des informations d'allumage ou d'extinction
Debug("***** Collecte de la consommation électrique pour la lampe " .. device .. " " .. " *****", "yellow");
local StateSem1 = CollecteStatus(7 * 86400, device); -- appel de la fonction => 1 semaine avant
local StateSem2 = CollecteStatus(14 * 86400, device); -- appel de la fonction => 2 semaines avant
-- si lampe active les dernières semaines et lampe actuellement éteinte => allumage
if (StateSem1 == 1 or StateSem2 == 1)
then
if (tonumber(fibaro:getValue(device, "value")) == 0) -- la lampe est éteinte
then
fibaro:call(device, "turnOn"); -- allumage
fibaro:call(device, "setValue", "50");
Debug("Allumage Lampe : " .. device, "green");
else
Debug("Pas d'action, lampe : " .. device .. " déjà allumée", "green");
end
end
-- si lampe inactive les dernières semaines et lampe actuellement allumée => extinction
if (StateSem1 == 0 and StateSem2 == 0)
then
if (tonumber(fibaro:getValue(device, "value")) > 0) -- si le device est allumé
then
fibaro:call(device, "turnOff"); -- extinction
Debug("Extinction Lampe : " .. device, "red");
else
Debug("Pas d'action, lampe : " .. device .. " déjà éteinte","red");
end
end
end
end
else
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 1061);
fibaro:log('Simulation inactive');
Debug('Simulation inactive');
end
fibaro:sleep(120000); -- temporise 2 minutes
Presence_Replicator v1.vfib
Presence_Replicator v2.vfib