Aller au contenu

Simulation de Présence


lionel

Messages recommandés

Script de Clarkkent609 posté ici :

 

http://forum.fibaro.com/viewtopic.php?t=3009

 

 

1ere étape:

Créer une variable prédéfinie :"Simu_presence" avec les valeurs "On" and "Off"

0jxc.png 

2eme étape:

créer un module virtuel
yo64.png 

3eme étape:

copier et coller ce code:

--[[ 
%% properties 

%% globals 
--]] 

fibaro:setGlobal("Simu_presence", "On"); 
--fibaro:debug("Simulation de présence activée"); 
fibaro:log("Simulation de présence activée"); 
fibaro:call(30, "setProperty", "ui.status.value", "activée"); 
--fibaro:debug(fibaro:getValue(30, "ui.status.value"))

30 =ID du module virtuel
coller ce code dans le second bouton: 
 

--[[ 
%% properties 

%% globals 
--]] 

fibaro:setGlobal("Simu_presence", "Off"); 
--fibaro:debug("Simulation de présence désactivée"); 
fibaro:log("Simulation de présence désactivée"); 
fibaro:call(30, "setProperty", "ui.status.value", "désactivée"); 
--fibaro:debug(fibaro:getValue(30, "ui.status.value"))

30 =ID module virtuel. 

Attention :  ID du Label doit contenir "status" : voir photo:

 
emk0.png 

4eme étape
copier et coller ce code dans le MAIN LOOP et remplacer par vos valeurs utilisateur
 

--[[ 
%% properties 
%% globals 
--]] 
-- LUA - Presence Simulator V1.0.0 
-- 
-- simulate a presence when you're on vacation. 
-- A part of code is reused, it can found here. Thanx to Richo: http://forum.fibaro.com/viewtopic.php?t=1892&postdays=0&postorder=asc&highlight=presence&start=15 
and here thx to Krikroff http://forum.fibaro.com/viewtopic.php?t=1656 


-- USER SETTINGS : 
local start_hour = 19;                          --hour to start simulation 
local start_minute = 30;                        --minute to start simulation, example 19:30 

local rndmaxtime = 20                           --random time of light change in minutes --> here each device is on max 20min 
local runtime = 90                              --how long to run simulation in minutes 

local ID_devices_lights = {17, 13}              --IDs of lights to use in simulation 
local numbers_lights = #ID_devices_lights       --numbers of light devices listed above 

local activated_push = true;                    --activate push when simulation starts and stops 
local ID_Smartphone = 7;                        --ID of your smartphone 

local simu = fibaro:getGlobal("Simu_presence"); --value of the global value: simulation is on or off 

local debug = true;                             --activate the debug mode 


-- DO NOT EDIT THE CODE BELOW (except to suit your needs) -- 
local minute = 60000 --in milliseconds 
local currentDate = os.date("*t"); 


SimulatorPresenceEngine = { 
  version = "1.0.0" 
}; 

-- function to switch off devices in the list 
function SimulatorPresenceEngine:TurnOff(group) 
  local name, id; 
  local ID_devices_group = group; 
       for i=1, #ID_devices_group do 
    id = tonumber(ID_devices_group[i]); 
    fibaro:call(id, "turnOff"); 
        if (debug) then 
         name = fibaro:getName(id); 
             if (name == nil or name == string.char(0)) then 
            name = "Unknown" 
              end 
          fibaro:debug("Device:" .. name .. " On "); 
        end 
      end 
end 

-- function to simulate a presence 
function SimulatorPresenceEngine:Launch() 
local start = os.time() 
local endtime = start + runtime*minute/1000     -- after how many minutes exit simulation     
    if (activated_push) then 
    fibaro:call(ID_Smartphone, 'sendPush', "Lights simulation started") ;    --send push notification 
    if (debug) then fibaro:debug("push start sent") end 
    end 
    while ((os.time() < endtime) and (simu == "On")) do 
        local random_light = tonumber(ID_devices_lights[math.random(numbers_lights)]) --choose a random light in the list 
        local lightstatus = fibaro:getValue(random_light, 'value') --get the value of the random light in the list 
        -- turn on the light if off or turn off if on 
        if  tonumber(lightstatus) == 0 then fibaro:call(random_light, 'turnOn') else fibaro:call(random_light, 'turnOff') end 
          fibaro:sleep(1000) ; --necessary to get back the new status, because HC2 is too fast :-) 
        lightstatus = fibaro:getValue(random_light, 'value') --get the value of the random light after his update 
        if (debug) then fibaro:debug('light ID:'..random_light..' status:'..lightstatus) end 
        local sleeptime = math.random(rndmaxtime*minute) --random sleep 
        fibaro:sleep(sleeptime) 
  
        local sleeptimemin = math.abs(sleeptime/60000) 
        if (debug) then fibaro:debug('sleeptime:'..sleeptimemin) end 
        simu = fibaro:getGlobal("Simu_presence"); --verify the global value, if the virtual device is deactivated, the scene stops. 

    end 
    
    --turn Off all lights 
    SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
    fibaro:call(ID_Smartphone, 'sendPush', "Lights simulation stopped") ; --send push notification 
    if (debug) then fibaro:debug("push stop sent") end 
    fibaro:sleep(60000); 
end 

-- Condition to start simulation 
if ((simu == "On")and (currentDate.hour == start_hour ) and (currentDate.min == start_minute))then 
    SimulatorPresenceEngine:Launch(); --launch the simulation when virtual device is on, and the current time is triggered. 
end

 
 

  • Upvote 4
Lien vers le commentaire
Partager sur d’autres sites

Attention :ecrire Simulation dans le label : voir photo:

 

emk0.png 

 

 

A mon sens, on peut écrire ce que l'on veut pour la valeur "Label"

Mais par contre, il est impératif de saisir status pour l'ID afin d'être en phase avec toute la programmation

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonsoir

 

Le plus simple, et surtout cet addon te serviras pour plein d'autre choses...

 

Installes le Toolkit de @Krikroff  ici :http://www.domotique-fibaro.fr/index.php/topic/239-hc2-toolkit-application-v1007-beta/

 

Tu retrouvera ainsi facilement l'ensemble des Id.

Lien vers le commentaire
Partager sur d’autres sites

Non Yohan ce n'est pas possible et même si cela semble étrange c'est beaucoup mieux comme cela, c'est un identifiant unique par incrémentation (comme tu le precises) de 1, crée par la B.D du HC2. Il n'est pas possible d'utiliser les places "libres" sauf ré-indexation complète avec les risques de complétement mettre HS le HC2 :rolleyes:. Ils ont déjà  de quoi s'occuper les devs Fibaro :P

 

Et puis si tu veux connaitre le nombre exacte de devices, nodes etc tu as le Toolkit onglet devices :15:

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je rencontre un petit problème que je n' arrive pas a résoudre et c'est pas faute d'avoir essayer ...

 

J'utilise le script de simulation de presence en sa version 1.0.1 (avec prise en compte de l'heure de couché de soleil) dont voici le code : 


--[[ 
%% autostart 
%% properties 
%% globals 
Simu_presence 
--]] 


-- LUA - Presence Simulator V1.0.1 
-- 
-- Modified by Jonny Larsson (jompa68) - 2014-01-24 
-- Changed from fixed START TIME to sunsetHour and to STOP Hour and Minute. 
-- 
-- 
-- Simulate a presence when you're on vacation. 
-- A part of code is reused, it can found here. Thanx to Richo: http://forum.fibaro.com/viewtopic.php?t=1892&postdays=0&postorder=asc&highlight=presence&start=15 
-- and here thx to Krikroff http://forum.fibaro.com/viewtopic.php?t=1656 
-- 


-- USER SETTINGS -- 

-- Timestamp when you want stop simulation -- 
local stop_hour = 23;                                -- Hour when you want simulation to stop 
local stop_minute = 00;                                -- Minute of the hour you want simulation to stop 
--------------------------------------------- 
local rndmaxtime = 20                          --random time of light change in minutes --> here each device is on max 20min 
local ID_devices_lights = {29,33,34}              --IDs of lights to use in simulation 
local numbers_lights = 3     --numbers of light devices listed above 
local activated_push = true;                    --activate push when simulation starts and stops 
local ID_Smartphone = 12;                        --ID of your smartphone 
local simu = fibaro:getGlobal("Simu_presence"); --value of the global value: simulation is on or off 
local debug = true;                             --activate the debug mode 

-- USER SETTINGS END -- 

-- DO NOT EDIT THE CODE BELOW (except to suit your needs) -- 
local simu = fibaro:getGlobal("Simu_presence"); --value of the global value: simulation is on or off 
local start_simu = fibaro:getValue(1, "sunsetHour"); --Start simulation when sunset 
local minute = 60000 --in milliseconds 
local start = os.date("%H:%M") 
local time = os.time() 
local date = os.date("*t", time) 
local year = date.year 
local month = date.month 
local day = date.day 
local endtime = os.time{year=year, month=month, day=day, hour=stop_hour, min=stop_minute, sec=sec} 


SimulatorPresenceEngine = { 
  version = "1.0.1" 
}; 

-- function to switch off devices in the list 
function SimulatorPresenceEngine:TurnOff(group) 
  local name, id; 
  local ID_devices_group = group; 
       for i=1, #ID_devices_group do 
    id = tonumber(ID_devices_group[i]); 
    fibaro:call(id, "turnOff"); 
        if (debug) then 
         name = fibaro:getName(id); 
             if (name == nil or name == string.char(0)) then 
            name = "Unknown" 
              end 
          fibaro:debug("Device:" .. name .. " Off "); 
        end 
      end 
end 

-- function to simulate a presence 
function SimulatorPresenceEngine:Launch() 

if (debug) then fibaro:debug("Simulation will stop: "..stop_hour..":"..stop_minute) end 

if (os.time() >= endtime) or (simu == "Off") then 
  if (debug) then fibaro:debug("Simulation stopped") end end 
  if (activated_push) then 
    fibaro:call(ID_Smartphone, 'sendPush', "Lights simulation started") ;    --send push notification 
    if (debug) then fibaro:debug("push start sent") end 
    end 
    while ((os.time() <= endtime) and (simu == "On")) do 
    fibaro:debug(os.time()) 
    if time == endtime then fibaro:debug("same value") end 
        local random_light = tonumber(ID_devices_lights[math.random(numbers_lights)]) --choose a random light in the list 
        local lightstatus = fibaro:getValue(random_light, 'value') --get the value of the random light in the list 
        -- turn on the light if off or turn off if on 
        if  tonumber(lightstatus) == 0 then fibaro:call(random_light, 'turnOn') else fibaro:call(random_light, 'turnOff') end 
          fibaro:sleep(1000) ; --necessary to get back the new status, because HC2 is too fast :-) 
        lightstatus = fibaro:getValue(random_light, 'value') --get the value of the random light after his update 
        if (debug) then fibaro:debug('light ID:'..random_light..' status:'..lightstatus) end 
        local sleeptime = math.random(rndmaxtime*minute) --random sleep 
        fibaro:sleep(sleeptime) 
  
        local sleeptimemin = math.abs(sleeptime/60000) 
        if (debug) then fibaro:debug('sleeptime:'..sleeptimemin) end 
        simu = fibaro:getGlobal("Simu_presence"); --verify the global value, if the virtual device is deactivated, the scene stops. 

    end 
    
    --turn Off all lights 
    SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
      if (activated_push) then 
    fibaro:call(ID_Smartphone, 'sendPush', "Lights simulation stopped"); --send push notification 
      if (debug) then fibaro:debug("push stop sent") end    
      end 
      sunset = 0 
    fibaro:sleep(60000); 
end 


-- Condition to start simulation 
if fibaro:getValue(1, "sunsetHour") == true then 
    sunset = 1 else sunset = 0 
end 

if (debug) and (simu == "On") then 
    fibaro:debug("Time is now: "..start) 
    fibaro:debug("Todays sunset: "..fibaro:getValue(1, "sunsetHour")) 
end 
if ((simu == "On") and os.time() <= endtime and sunset == 1 ) then 
--fibaro:getValue(1, "sunsetHour") 
  SimulatorPresenceEngine:Launch(); --launch the simulation when virtual device is on, and the current time is triggered. 
    elseif sunset == 0 then 
      fibaro:debug("Simu_presence will not be activated before sunset") 
      elseif os.time() >= endtime then 
      fibaro:debug("After simu_presences stop time") 
end 

if (simu == "Off") then 
  fibaro:debug("Simulation is deactivated") 
end 
 

Seulement le script ne se déclenche pas ! Malgré le fait que l'heure de sunset soit dépassée, quand je suis en debug la console me renvoi ceci :

 

[DEBUG] 20:47:44: Simu_presence will not be activated before sunset
[DEBUG] 20:47:44: Simulation is deactivated

 

 

 

Je ne comprend pas pourquoi car la condition semble correctement écrite mais rien n' y fait ! 

 

D'avance merci pour le coup de main :)

Lien vers le commentaire
Partager sur d’autres sites

Pourrais tu vérifier l'état de la variable sunsetHour dans le panneau Variables lorsque le script devrait fonctionner ? Il devrait aussi avoir dans le debug une ligne Todays sunset: ...

Lien vers le commentaire
Partager sur d’autres sites

Salut et merci pour la réponse.

 

Alors ou puis je verifier la variable sunsetHour ? 

 

Sinon effectivement dans le debug j' ai d'un coup plus d' infos : 

 

DEBUG] 22:22:22: Time is now: 22:22
[DEBUG] 22:22:22: Todays sunset: 18:03
[DEBUG] 22:22:22: Simu_presence will not be activated before sunset

 
 
Donc la ça confirme bien que ça déconne :)
 
j' ai testé la valeur de sunset a la ligne 116 pour verifier qu'il était bien a 1 a ce moment la mais en fait il reste a 0. 
 
Je crois que la ligne 115 pose problème dans mon cas. 
Lien vers le commentaire
Partager sur d’autres sites

Ok effectivement, je l' ai lu mais je n' y ai pas vraiment prêté attention en fait. Je ne suis pas encore très au point avec le LUA.

 

Mais bon concrètement qu'est ce que je dois faire. Une variable globale sunsetHour qui peut prendre 0 ou 1 en valeur ? 

 

Car si c'est ça, j' ai deja essayé et ça fonctionne pas mieux. 

 

Nan j'avoue que je suis un peu perdu. Je ne comprend pas pourquoi on a besoin d un variable globale. Pour moi on fait un getValue sur le HC2 pour récupérer "l'état" de sunset, a savoir si le soleil est couché ou pas. Mais je crois que j' ai pas tout bien pigé ! 

 

D'un autre coté je suis un peu fatigué :) ça n' aide pas des masses !

Lien vers le commentaire
Partager sur d’autres sites

je trouve étrange la ligne 115, oui effectivement c'est pas une variable global mais une variable système avec une heure donc pourquoi une comparaison true/false ? Donc il doit manquer une variable qui est mise àjour avec un code comme celui-ci depuis un scène:

--[[
%% autostart
%% properties
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == fibaro:getValue(1, "sunsetHour")) )
)
then
	fibaro:setGlobal("sunsetHour", true);
end

ou juste une comparaison si heure > fibaro:getValue(1, "sunsetHour")... Mais je suis aussi fatigué donc ...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour.

Merci pour votre aide.

Bon je suis rassuré a la lecture de vos commentaires car effectivement je ne comprenais pas comment, a la ligne 115, cela pouvait renvoyer autre chose que false en fait.

Krikroff, j'ai essayé de tester si heure >= fibaro:getValue(1,sunsetHour) mais la j ai une erreur car je compare une datetime a un string.

Je n'arrive pas a comprendre comment fonctionne sunsetHour.

J'aimerais bien faire fonctionner ce script mais la ça depasse malheureusement mes capacités.

Faudrais que je me mette au LUA plus serieusement :)

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...