Aller au contenu

Recommended Posts

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

Modifié par bencol
  • Upvote 10

Partager ce message


Lien à poster
Partager sur d’autres sites

L'idée est très sympa et on ne se casse pas la tête àsimuler un truc qui tient la route.

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent ! Skynet est dans la place :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Yes,

 

Superbe idee, merci beaucoup !!

Partager ce message


Lien à poster
Partager sur d’autres sites

Bravo pour l'idée, félicitation pour le code et merci pour le partage.   ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent ! Je vais tester ça pour mes prochaines vacances

Partager ce message


Lien à poster
Partager sur d’autres sites

Rien àdire àpart que c'est une excellente idée

je teste cela ce soir

Partager ce message


Lien à poster
Partager sur d’autres sites

Chapeau bas pour cette excellente idée. :13:

Je vais tester ce script et l'adapter pour remplacer le script simulation de présence basé sur de l'aléatoire. Plus besoin de s'occuper de sunset et sunrise.

 

Je cherchais quoi améliorer de la HC2. C'est tout trouvé. :lol:

Partager ce message


Lien à poster
Partager sur d’autres sites

Bravo pour l'idée, félicitation  :60: 

 

juste un question le bouton On Off c'est pour quoi exactement 

Partager ce message


Lien à poster
Partager sur d’autres sites

génial ! on peut donc même simuler des lumières le matin !

Désolé sebcbien, mais je crais que ton excellent script va prendre une retraîte bien méritée.

 

@971jmd : le bouton on / off, c'est pour lancer ou pas la simulation

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok merci

Si je comprend bien, le script surveille nos habitude dés ca premier installation

Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @Bencol 

 

Ton VD à  l'air top par contre, quand je lance le Debug chez moi il me dit ça :

[DEBUG] 15:55:47: Simulateur actif....
[ERROR] 15:55:47: line 83: attempt to compare number with nil

Une idée ???

Partager ce message


Lien à poster
Partager sur d’autres sites

@971jmd : peux tu me préciser àquoi correspond la ligne 83 chez toi. Si elle correspond àla condition State==1, cela signifie que State est null. Je n'ai pas réussi àreproduire ce cas de mon coté. Remonte le code en mettant un debug sur les variables State1, State2 et State3 pour voir.

Partager ce message


Lien à poster
Partager sur d’autres sites

N'hésitez pas àme faire des retours pour savoir si cela marche correctement chez vous.

Partager ce message


Lien à poster
Partager sur d’autres sites

Version publiée avec un mode debug plus poussé si besoin.

Partager ce message


Lien à poster
Partager sur d’autres sites

Version publiée avec un mode debug plus poussé si besoin.

 

As tu modifié le code publié dans la première publication?

Cela m'éviterait de re-importer le VD.

Partager ce message


Lien à poster
Partager sur d’autres sites

Super mais si le module ne remonte pas la consommation électrique il ne seras pas prit en compte ?

Partager ce message


Lien à poster
Partager sur d’autres sites

En paramétrant une conso fixe dans le module ça devrait le faire.

Partager ce message


Lien à poster
Partager sur d’autres sites

@kionoranga : pas de modif du code àpart des debugs

@Allan2b : si le module ne sait pas remonter de conso, il ne sera pas pris en compte. Mais Fibaro propose de saisir une conso fixe et il la prend en compte dans ce cas.

Partager ce message


Lien à poster
Partager sur d’autres sites

Super bonne idée, bravo !

Personnellement, ce qui m'embêterait, c'est que comme je n'ai ni volets, ni rideaux, je sélectionne les lampes que je veux voir s'allumer... Car si quelqu'un observe et voit la lumière la sam s'allumer alors que personne ne passe...

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Peut être penser àmettre en place le versionning pour s'y retrouver.

Partager ce message


Lien à poster
Partager sur d’autres sites

×