Aller au contenu

Yaps - Présence Simulator, Un De Plus


sebcbien

Messages recommandés

YAPS - Présence Simulator, Un De Plus ... ?

 

 

Voici un petit script qui améliore (enfin pour moi en tout cas) les scripts de simulation de présence existants.

 

Je me suis basé sur celui-ci: http://forum.fibaro.com/viewtopic.php?p=52734#52734 que j'ai amélioré depuis quelques temps mais sur le forum officiel.

Ce script enclenche la simulation au coucher du soleil et la termine à  heure fixe définie dans les variables:

local stop_hour = "01"
local stop_minute = "10";

Pas besoin d'utiliser le VirtualDevice pour activer et désactiver, définir la Variable Globale  "Simu_presence" (via GEA par exemple) enclenche ou déclenche la scène

Le Virtual device surveille aussi l'état de la VG et se modifie en fonction pour afficher la bonne icône et le status en toutes lettres.

 

Pour cela, j'ai modifié le script pour qu'il tourne dans une scène (appuyer sur les boutons des VD via script me gave, les boutons changent d'id, en cas de reset complet de la box il faut retrouver les id etc...

J'ai ajouté un mode "marche forcée"

J'ai ajouter l'exit immédiat en cas de changement de Variables Globales

J'ai ajouté la possibilité d'allumer une lampe en fin de script

J'ai corrigé pas mal de bugs du script d'origine, je pense qu'il n'y en a plus actuellement

 

Soit, rien de tel que les VG et les scènes, très faciles pour utiliser avec GEA, scènes en mode block etc.

Je garde les Virtual Devices pour l'apparence et les commandes (via modification de VG)

Avantages: Portabilité, interaction avec d'autres scripts possibles, migration aisée.

 

Première étape:

 

Créer une Variable Globale prédéfinie "Simu_presence" avec les valeurs  0 et 1

Créer une Variable Globale prédéfinie "overideSimuSunset" avec les valeurs  0 et 1

 

Deuxième étape:

 

Créer le Virtual Device:

post-826-0-96522600-1420577874_thumb.jpg

Pour cela, importer le fichier:

Presence_Simulator.vfib (ajouter nouveau virtual device)

 

Pour avoir une idée:

Voici le bouton ON:


fibaro:setGlobal("Simu_presence", "1")
fibaro:setGlobal("overideSimuSunset", "0")

OFF:


fibaro:setGlobal("Simu_presence", "0")
fibaro:setGlobal("overideSimuSunset", "0")

Override:


fibaro:setGlobal("Simu_presence", "1")
fibaro:setGlobal("overideSimuSunset", "1")

et le main loop:


--------------------------------
-- YAPS Presence Simulator V2.0
-- SebcBien
-- Janvier 2015
--------------------------------


local thismodule = fibaro:getSelfId(); 
local presence = fibaro:getGlobal("Simu_presence")
local overide = fibaro:getGlobal("overideSimuSunset")
--fibaro:debug(presence)
--fibaro:debug(overide)
if presence == "1" then presencemsg = "ON" else presencemsg = "OFF" end
if overide == "1" then overidemsg = "ON" else overidemsg = "OFF" end


fibaro:log(presencemsg .. " (Overide " .. overidemsg .. ")")
fibaro:call(thismodule, "setProperty", "ui.status.value", "Presence: " .. presencemsg .. " (Overide " .. overidemsg .. ")");


--fibaro:debug(thismodule);


if
presence == "1"
then 
fibaro:call(thismodule, "setProperty", "currentIcon", 1026)
end


if
presence == "0"
then 
fibaro:call(thismodule, "setProperty", "currentIcon", 1027)
end


fibaro:sleep(5000);
 
 

 

Troisième étape:

Créer une nouvelle scène lua

et y mettre ce code:

Attention, ce n'est plus la dernière version, voir les pages suivantes pour les mises à  jour.

LA DERNIERE VERSION SERA TOUJOURS SUR GITHUB !!!https://github.com/sjauquet

Ensuite Allez sur YAPS.scene.lua et télécharger avec le bouton RAW si vous ne voulez pas installer un client GIT (SmartGit est top ;-) )

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

--------------------------------
-- YAPS Presence Simulator V2.0
-- SebcBien
-- Janvier 2015
--------------------------------

if (fibaro:countScenes() > 1) then 
fibaro:debug("More than one scene active, exiting!"); 
fibaro:abort(); 
end 

--------------------- USER SETTINGS -------------------------------- 
local id = {
		 LAMPE_SDB		   = 16,
		 LAMPE_CH_AMIS     = 24,
		 LAMPE_SALON	   = 45,
		 LAMPE_BUREAU	   = 49,
		 LAMPE_HALL        = 52,
		 LAMPE_CELLIER     = 56,
		 LAMPE_CH_EMILIEN  = 58
	}
  
local stop_hour = "01"; -- Hour when you want simulation to stop 
local stop_minute = "10"; -- Minute of the hour you want simulation to stop 
-- note 1: the script will not exit while waiting the random time of the last light turned on. So end time can be longer than specified end time
-- note 2: if the global variable changes during the same wait time as above, it will exit immediately (when back home while simulation runs)
local rndmaxtime = 30 -- random time of light change in minutes --> here each device is on maximum 30min 
local ID_devices_lights = {id["LAMPE_SDB"],id["LAMPE_HALL"],id["LAMPE_BUREAU"],id["LAMPE_CELLIER"],id["LAMPE_CH_AMIS"]} -- IDs of lights to use in simulation 
--local ID_devices_lights = {id["LAMPE_HALL"],id["LAMPE_BUREAU"],id["LAMPE_CELLIER"]} -- IDs of lights to use in simulation
local activatePush = true; -- activate push when simulation starts and stops 
local ID_Smartphone = 53; -- ID of your smartphone 
local ID_On_After_Simu = id["LAMPE_HALL"] -- Only One ID of a lamp to turn on after simulation ends (set 0 to disable)

--------------------- USER SETTINGS END ---------------------------- 


----------------------ADVANCED SETTINGS----------------------------- 
local showStandardDebugInfo = true; -- Debug shown in white 
local showExtraDebugInfo = true; -- Debug shown in orange 
local numbers_lights = #ID_devices_lights -- numbers of light devices listed above 
local manualOveride = fibaro:getGlobal("overideSimuSunset"); -- if = 1 then the simulation is forced
-------------------------------------------------------------------- 

----------------------------------- 
----- Do not change code below ---- 
----------------------------------- 

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 start_simu = "22:28" 
local endtime 
version = "1.1.0" 

SimulatorPresenceEngine = {}; 

-- debug function 
Debug = function ( color, message ) 
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); 
end 

ExtraDebug = function (debugMessage) 
if ( showExtraDebugInfo ) then 
Debug( "orange", debugMessage); 
end 
end 

StandardDebug = function (debugMessage) 
if ( showStandardDebugInfo ) then 
Debug( "white", debugMessage); 
end 
end 

-- function push message to mobile 
pushMessage = function (sendPush) 
if (activatePush) then 
ExtraDebug("Push info sent to mobile") 
fibaro:call(ID_Smartphone, 'sendPush', sendPush); 
end 
end 

-- function to switch off devices in the list 
function SimulatorPresenceEngine:TurnOff(group) 
Debug("red","TurnOff All lights!") 
local name, id2; 
local ID_devices_group = group; 
for i=1, #ID_devices_group do 
id2 = tonumber(ID_devices_group[i]); 
fibaro:call(id2, "turnOff"); 
name = fibaro:getName(id2); 
if (name == nil or name == string.char(0)) then 
name = "Unknown" 
end 
StandardDebug("Device:" .. name .. " Off "); 
end 
  if ID_On_After_Simu ~= 0 then
  fibaro:call(ID_On_After_Simu, "turnOn"); 
  end
end 


-- function to calculate endtime 
function SimulatorPresenceEngine:EndTimeCalc() 

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 
endtime = os.time{year=year, month=month, day=day, hour=stop_hour, min=stop_minute, sec=sec} 
--ExtraDebug ("CurrentTime" ..os.time()) 
--ExtraDebug ("Original EndTime " ..endtime) 
if endtime < os.time() then 
endtime = endtime + 24*60*60 
-- ExtraDebug ("Modified Endtime " ..endtime) 
end 
end 

-- function to simulate a presence 
function SimulatorPresenceEngine:Launch() 
ExtraDebug( "Simulation will stop: "..stop_hour..":"..stop_minute ); 
if (os.time() >= endtime) or (simu == "0") or (manualOveride == "0") then 
ExtraDebug("Simulation stopped") 
SimulatorPresenceEngine:TurnOff(ID_devices_lights) 
end 

pushMessage("Lights simulation started") 
while ((os.time() <= endtime) and (simu == "1")) or ((manualOveride == "1")) do 
-- original code: while ((os.time() <= endtime) and (simu == "1")) or ((os.time() <= endtime) and (simu == "1") and (manualOveride == "1")) do 
if time == endtime then StandardDebug("time and endtime same value -> end") 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 
StandardDebug('light ID:'..random_light..' status:'..lightstatus) 
local sleeptime = math.random(rndmaxtime*60000) --random sleep 
    fibaro:debug("entering loop of " .. sleeptime/60000 .. "minutes")
-- This modification allows to exit the scene if the Simu_presence global var changes to 0 during the random  sleep
    local counterexitsimu = 200
    	while (counterexitsimu > 0) do
      		counterexitsimu = counterexitsimu - 1;
      		test_presence_state = fibaro:getGlobal("Simu_presence")
      		simu = tonumber(test_presence_state); --verify the global value, if the virtual device is deactivated, the scene stops. 
      		--fibaro:debug("simu var state : " .. simu)
    		if simu == 0 then
        	counterexitsimu = 0
        	end
	    fibaro:sleep(sleeptime/200) 
    	end
    fibaro:debug("exiting loop of " .. sleeptime/60000 .. "minutes")
local sleeptimemin = math.abs(sleeptime/60000) 
StandardDebug('sleeptime:'..sleeptimemin) 
simu = fibaro:getGlobal("Simu_presence"); --verify the global value, if the virtual device is deactivated, the scene stops. 
manualOveride = fibaro:getGlobalValue("overideSimuSunset") 
end 
end 


-- Main Script beginning 

SimulatorPresenceEngine:EndTimeCalc(); 

if (simu == "1") then 
Debug("green", "Simulate Presence at Home | v" .. version ); 
Debug( "green", "--------------------------------------------------"); 
ExtraDebug("Today's sunset: "..fibaro:getValue(1, "sunsetHour")) 
end 

if (simu == "1") then 
Debug("grey", "Simulate Presence will start at "..start_simu) 
pushMessage("Simulate Presence will start at "..start_simu)
end 

-- Main Loop 
while (simu=="1") do 

-- Condition to start simulation 
simu = fibaro:getGlobal("Simu_presence"); 
manualOveride = fibaro:getGlobal("overideSimuSunset"); 

if (os.date("%H:%M") >= start_simu) then 
sunset = 1 
else 
sunset = 0 
end 

if ((simu == "1") and os.time() <= endtime and sunset == 1 ) or ((simu == "1") and manualOveride == "1" ) then 
SimulatorPresenceEngine:Launch(); --launch the simulation. 

if manualOveride == "1" and sunset == 0 then 
Debug("grey", "Manual override activated") 
elseif sunset == 1 then 
Debug("grey", "It's sunset time, starting simulation") 
end 

if sunset == 0 and manualOveride == "0" then 
Debug("grey", "Not manual override so Presence Simulation will not be activated"); 
elseif os.time() >= endtime then 
Debug("grey", "Time is now after:"..stop_hour..":"..stop_minute.."deactivating"); 
SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
Debug("red","Simulation is deactivated") 
pushMessage("Lights simulation stopped") 
end 
end 
end 

-- Condition to end simulation 
if (simu == "0") then 
SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
Debug("red","Simulation is deactivated") 
pushMessage("Lights simulation stopped") 
end 
Debug("red","Exit from scene") 

Dans user settings vous pouvez y mettre votre liste d'id "format GEA" (ça facilite quand il faut tout réinstaller hein   ;) )

Pour définir la variable rndmaxtime, pensez que ce script n'allume pas une lampe après en avoir éteint une autre, mais il y en aura tantôt 3 d'allumées, puis 1 s'éteint etc. c'est donc plutôt une variable qui définit le "mouvement" dans la maison, il n'y a pas d'effet sapin de noà«l qui clignotte ;)

S'il y a une demande je pourrais considérer de traduire le code en français, mais je pense que avec des rudiments d'anglais ça se lit facilement ;-)

 

Les icônes viennent du post 6 de ce fil: http://www.domotique-fibaro.fr/index.php/topic/198-simulation-de-pr%C3%A9sence/

 

pour les id des icônes pour remplacer dans le mainloop du virtual device, 

 


if
presence == "1"
then 
fibaro:call(thismodule, "setProperty", "currentIcon", 1026)
end


if
presence == "0"
then 
fibaro:call(thismodule, "setProperty", "currentIcon", 1027)
end

je l'ai fait à  l'arrache mais apparemment il y a une méthode plus scientifique en utilisant le toolkit de Krikroff... si une bonne âme la connait, feel free to post  :)

Enjoy !

 

icônes pour VD et Scène:

post-826-0-13714500-1439060172_thumb.png

 

post-826-0-77220800-1439060207_thumb.png

  • Like 1
  • Upvote 3
Lien vers le commentaire
Partager sur d’autres sites

Oui, je dis même que c'est là  qu'il faut aller chercher les icônes ;-)

 

Il se base sur le même post que moi sur le forum officiel fibaro.

 

Il y a une chose qui m'embêtait prodigieusement avec ce script, c'est que quand je rentre chez moi, la simulation s'arrête... mais pas tout de suite car le script est dans un sleep de disons 15 minutes.

quand ces 15 minutes sont passée, le script éteint les lampes... et on se retrouve dans le noir... pas WAF, pas cool ;-)

 

Autre chose, ce script ici commence la simulation en fonction du coucher de soleil... sachant qu'il peut y avoir plus 5h de décalage entre l'été et l'hiver, ça me semble appréciable aussi...

Lien vers le commentaire
Partager sur d’autres sites

Perso je préfère lancer une simulation de présence au moment où je rentre d'habitude du boulot (env 18:30). J'avoue je suis sur mon téléphone et je n'ai pas analysé ton code, mais est il possible de régler une heure de démarrage ou bien est ce que ca lance quand il fait nuit et c'est tout ? Lier les deux serait pas mal.

J'utilise le virtual device alarme avancé (jour nuit silence avec un test des capteurs) décrit qqpart dans ce furum (dont j'ai déjàdû remercier l'auteur). J'y ai ajouté un bouton qui lance ou stop la simulation de présence. Pour le stop, ca kill la scène... Pas question de délais ici. D'ailleurs l'arrêt de l'alarme kill également la scène.

Quand je rentre je jette un oeil plus sérieux àton code. Il me semble qu'il a de bonnes lignes bien pratiques

Lien vers le commentaire
Partager sur d’autres sites

oui pour mes tests j'ai ajouté une ligne dans le code pour forcer une heure:

 

Ligne 58:

--local start_simu = "22:28" 

il suffit de la "décommenter" et mettre l'heure désirée

 

 

Le problème quand on kill une scène c'est que les lampes restent allumées... alors que si on laisse le script se terminer il va éteindre les lumières allumées proprement.

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

  • 2 semaines après...

Salut Seb

 

petit question sur les variables

local stop_hour = "03"; -- Hour when you want simulation to stop 
local stop_minute = "40"; -- Minute of the hour you want simulation to stop 

cela correspond à  l'heure d'arrêt de la simulation ou de la durée de simulation?

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

merci pour la réponse rapide.

mais par contre désolé, mais j'aurai bien vu plutôt une durée de simulation.

je ne trouve pas cohérent en sachant que l'heure de début n'est pas la même...

 

en plus une heure de fin fixe, ca se trace facilement ;)

 

 

enfin merci quand même, j'utilisais l'ancienne version avant...

Lien vers le commentaire
Partager sur d’autres sites

Mon avis c'est que:

- Habituellement, l'extinction des feux est +- fixe dans une habitation, il faut se lever le lendemain 
- Si quelqu'un s'amuse à  "tracer" jusqu'à  4h du matin, il remarquera aussi que personne ne rentre ni ne sors de la maison ...
- Une maison ce n'est pas une banque et un scénario style la grande évasion me semble peu plausible  ;)

Maintenant si tu veux mettre une durée ce n'est pas difficile, il suffit d'ajouter XX heures et XX minutes à  la variable endtime... mais vu l'écart entre hiver et été, ça risque de couper la simulation a 6h du matin en été et a 11h en hiver...

Sent From my Vic20

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

merci pour le tuto.

je n'arrive pas à  envoyer les push sur plusieurs téléphone (j'ai une erreur de script).

le push de démarrage de simulation indique toujours la même heure (16h22).

[DEBUG] 19:45:12: Simulate Presence at Home | v1.1.0
[DEBUG] 19:45:12: --------------------------------------------------
[DEBUG] 19:45:12: Today's sunset: 16:22
[DEBUG] 19:45:12: Simulate Presence will start at 16:22
[DEBUG] 19:45:12: Push info sent to mobile
[DEBUG] 19:45:12: Simulation will stop: 01:10

Serait il possible d'envisager un lien avec l'alarme intrusion pour avoir 2 méthode d’arrêt de la scène.

- automatique à  (ex:1h10) ou par pression du bouton off du virtuel device. qui laisserai toutes les lampes à  off.

- lorsque arrêt de l'alarme intrusion, laisserai une lampe allumé pour ne pas ce retrouver dans le noir après désactivation.

Lien vers le commentaire
Partager sur d’autres sites

quelqu'un a posté ce code sur le forum fibaro officiel pour plusieurs devices a notifier:

Je n'ai pas testé personnellement car je n'ai pas envie de bombarder ma femme ;):

 

à  la place de ce code:

local ID_Smartphone = 53; -- ID of your smartphone 

Mettez celui-ci:

local ID_Smartphones = {iPhone=4,iPad=5}; 

et à  la place de ceci:

pushMessage = function (sendPush) 
if (activatePush) then 
ExtraDebug("Push info sent to mobile") 
fibaro:call(ID_Smartphone, 'sendPush', sendPush); 
end 
end 

Mettez ce code ci:

pushMessage = function (sendPush) 
  if (activatePush) then 
    for i, j in pairs(ID_Smartphones) do 
      fibaro:call(j, 'sendPush', sendPush); 
      ExtraDebug("Push message ("..sendPush..") sent to mobile: "..i); 
    end 
  end 
end 

Si ça fonctionne je l’inclurai dans le code principal

Lien vers le commentaire
Partager sur d’autres sites

pour exit sur plusieures VG: il suffit d'ajouter un test dans cette boucle:

test_presence_state = fibaro:getGlobal("Simu_presence")
simu = tonumber(test_presence_state); --verify the global value, if the virtual device is deactivated, the scene stops. 
--fibaro:debug("simu var state : " .. simu)
if simu == 0 then
counterexitsimu = 0

end

ajouter par exemple juste après:

test_alarm_state = fibaro:getGlobal("Alarm_State")
simu = tonumber(test_alarm_state); --verify the global value, if the virtual device is deactivated, the scene stops.
--fibaro:debug("simu var state : " .. simu)
if simu == 0 then
counterexitsimu = 0
end

et doubler les vérifications de sortie du script de la même manière... un peu lourd...

 

Personnellement, je ne toucherais pas au simulateur, mais en fin d'alarme, je mettrais simu présence à  0 puis un sleep 1,2 ou 3 secondes (le temps que la simulation s’arrête) et ensuite rallumer les lampes que l'on veut.

ainsi la gestionde l'alarme ne "polue" pas la simulation de présence et les gestions restent séparées

Lien vers le commentaire
Partager sur d’autres sites

...

 

Merci, ca fonctionne bien.

 

 

...

 

 

c’était une idée pour éviter de faire Off puis On sur un éclairage et de me retrouver dans le noir.

je n'ai pas les connaissance du Lua pour faire ca. si une âme charitable passe par ici, je suis preneur :D

Lien vers le commentaire
Partager sur d’autres sites

Je ne comprends pas,

Si tu met la simulation de présence et l'alarme c'est que tu n'est pas chez toi ? si ?

De toute façon le script n'éteint que les lampes de la simulation.

Donc si l'alarme retentit et que tu dors, si tu allume la lumière de ta chambre elle restera allumée...

Lien vers le commentaire
Partager sur d’autres sites

J’ai ma lampe entré dans le script simu.

L’alarme est activée lorsque je ne suis pas là.

Lorsque j’arrive, si j’allume cette lampe en entrant ou qu’elle soit déjàallumée par le script.

Quand je vais couper l’alarme, je me retrouve dans le noir.

Du coup, je vais plutôt acheter un module éclairage supplémentaire pour faire la simulation sur une autre lampe àproximité et laisser la lampe entrée hors du script. ;)

Lien vers le commentaire
Partager sur d’autres sites

je reviens à  la charge. J'ai un autre script de gestion de la simulation de présence, mais j'ai fait quelque chose du genre :

 - une variable qui indique si la simulation doit être en marche ou pas.

 - une durée de simulation

 - ma boucle prend fin soit sur la variable qui change d'état, soit sur la fin de la durée.

  - si c'est la fin de la durée de simulation, alors on éteint toutes les lampes

  - si c'est la fin à  cause de la variable, alors j'éteint tout sauf la lampe dans l'entrée. (ça veut dire que c'est moi qui ai déclenché l'arrêt de l'alarme)

Du coup, pas besoin d'acheter de lumière supplémentaire.

y'a pas moyen de faire ça dans votre script ?

Lien vers le commentaire
Partager sur d’autres sites

J’ai ma lampe entré dans le script simu.

L’alarme est activée lorsque je ne suis pas là .

Lorsque j’arrive, si j’allume cette lampe en entrant ou qu’elle soit déjà  allumée par le script.

Quand je vais couper l’alarme, je me retrouve dans le noir.

Du coup, je vais plutôt acheter un module éclairage supplémentaire pour faire la simulation sur une autre lampe à  proximité et laisser la lampe entrée hors du script. ;)

C'est déjà  prévu ;-)

 

Dans le premier post:

"J'ai ajouté la possibilité d'allumer une lampe en fin de script"

local ID_On_After_Simu = id["LAMPE_HALL"] -- Only One ID of a lamp to turn on after simulation ends (set 0 to disable)
Lien vers le commentaire
Partager sur d’autres sites

je reviens à  la charge. J'ai un autre script de gestion de la simulation de présence, mais j'ai fait quelque chose du genre :

 - une variable qui indique si la simulation doit être en marche ou pas.

 - une durée de simulation

 - ma boucle prend fin soit sur la variable qui change d'état, soit sur la fin de la durée.

  - si c'est la fin de la durée de simulation, alors on éteint toutes les lampes

  - si c'est la fin à  cause de la variable, alors j'éteint tout sauf la lampe dans l'entrée. (ça veut dire que c'est moi qui ai déclenché l'arrêt de l'alarme)

Du coup, pas besoin d'acheter de lumière supplémentaire.

y'a pas moyen de faire ça dans votre script ?

en fait chez moi la lumière que j'allume en fin de script est une lumière qui s'allume et s'éteint avec un capteur de mouvement.

L'allumer d'office n'est donc pas un problème vu qu'elle s'éteint automatiquement après 3 minutes.

 

Maintenant en modifiant la ligne 103 comme ci-dessous (ajout de la condition qui vérifie variable_a_tester) le script choisira de rallumer ou non la lampe

 

 

  if (ID_On_After_Simu ~= 0 and variable_a_tester == "1") then
 
Lien vers le commentaire
Partager sur d’autres sites

nouvelle version 2.2:

ajout de la liste pour mobiles

ajout du mode manual_stop

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

--------------------------------
-- YAPS Presence Simulator V2.2
-- SebcBien
-- Janvier 2015
--------------------------------

-- Added Manual Stop variable
-- added list of mobiles

if (fibaro:countScenes() > 1) then 
fibaro:debug("More than one scene active, exiting!"); 
fibaro:abort(); 
end 

--------------------- USER SETTINGS -------------------------------- 
local id = {
	LAMPE_SDB		= 16,
	LAMPE_CH_AMIS		= 24,
	LAMPE_SALON		= 45,
	LAMPE_BUREAU		= 49,
	LAMPE_HALL		= 52,
	LAMPE_CELLIER		= 56,
	LAMPE_CH_EMILIEN	= 58,
	PHONE_NEXUS_5		= 53,
	PHONE_NEXUS_4		= 104
	}
  
local stop_hour = "01"; -- Hour when you want simulation to stop 
local stop_minute = "10"; -- Minute of the hour you want simulation to stop 
-- note 1: the script will not exit while waiting the random time of the last light turned on. So end time can be longer than specified end time
-- note 2: if the global variable changes during the same wait time as above, it will exit immediately (when back home while simulation runs)
local rndmaxtime = 15 -- random time of light change in minutes --> here each device is on maximum 30min 
local ID_devices_lights = {id["LAMPE_SDB"],id["LAMPE_BUREAU"],id["LAMPE_HALL"],id["LAMPE_CELLIER"],id["LAMPE_CH_AMIS"]} -- IDs of lights to use in simulation 
--local ID_devices_lights = {id["LAMPE_HALL"],id["LAMPE_BUREAU"],id["LAMPE_CELLIER"]} -- IDs of lights to use in simulation
local activatePush = true; -- activate push when simulation starts and stops 
local ID_Smartphone = 53; -- ID of your smartphone 
local ID_Smartphones = {id["PHONE_NEXUS_5"],id["PHONE_NEXUS_4"]}; 
local ID_On_After_Simu = id["LAMPE_HALL"] -- Only One ID of a lamp to turn on after simulation ends (set 0 to disable)
local Manual_Stop = 1 -- 0 will not turn on the lamp "ID_On_After_Simu" at the end of the script. Replace this variable by a global value if you want to automate

--------------------- USER SETTINGS END ---------------------------- 


----------------------ADVANCED SETTINGS----------------------------- 
local showStandardDebugInfo = true; -- Debug shown in white 
local showExtraDebugInfo = true; -- Debug shown in orange 
local numbers_lights = #ID_devices_lights -- numbers of light devices listed above 
local manualOveride = fibaro:getGlobal("overideSimuSunset"); -- if = 1 then the simulation is forced
-------------------------------------------------------------------- 

----------------------------------- 
----- Do not change code below ---- 
----------------------------------- 

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 start_simu = "22:28"  -- uncomment this line when testing to force a start hour 1 min after saving the scene.
local endtime 
version = "2.2" 

SimulatorPresenceEngine = {}; 

-- debug function 
Debug = function ( color, message ) 
		fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); 
	end 

ExtraDebug = function (debugMessage) 
	if ( showExtraDebugInfo ) then 
		Debug( "orange", debugMessage); 
	end 
	end 

StandardDebug = function (debugMessage) 
	if ( showStandardDebugInfo ) then 
		Debug( "white", debugMessage); 
	end 
	end 

-- function push message to mobile 
pushMessage = function (sendPush) 
    if (activatePush) then 
    for i=1, #ID_Smartphones do 
      fibaro:call(tonumber(ID_Smartphones[i]), 'sendPush', sendPush); 
      ExtraDebug("Push message ("..sendPush..") sent to mobile: "..tonumber(ID_Smartphones[i])); 
    end 
	end 
	end 

-- function to switch off devices in the list 
function SimulatorPresenceEngine:TurnOff(group) 
	Debug("red","TurnOff All lights!") 
	local name, id2; 
	local ID_devices_group = group; 
	for i=1, #ID_devices_group do 
	id2 = tonumber(ID_devices_group[i]); 
	fibaro:call(id2, "turnOff"); 
	name = fibaro:getName(id2); 
	if (name == nil or name == string.char(0)) then 
		name = "Unknown" 	
	end 
	StandardDebug("Device:" .. name .. " Off "); 
	end 
	  if (ID_On_After_Simu ~= 0 and Manual_Stop == 1) then
	  fibaro:call(ID_On_After_Simu, "turnOn"); 
	  end
	end 


-- function to calculate endtime 
function SimulatorPresenceEngine:EndTimeCalc() 

	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 
	endtime = os.time{year=year, month=month, day=day, hour=stop_hour, min=stop_minute, sec=sec} 
	--ExtraDebug ("CurrentTime" ..os.time()) 
	--ExtraDebug ("Original EndTime " ..endtime) 
	if endtime < os.time() then 
		endtime = endtime + 24*60*60 
	-- ExtraDebug ("Modified Endtime " ..endtime) 
	end 
	end 

-- function to simulate a presence 
function SimulatorPresenceEngine:Launch() 
	ExtraDebug( "Simulation will stop: "..stop_hour..":"..stop_minute ); 
	if (os.time() >= endtime) or (simu == "0") or (manualOveride == "0") then 
		ExtraDebug("Simulation stopped") 
		SimulatorPresenceEngine:TurnOff(ID_devices_lights) 
	end 

	pushMessage("Lights simulation started") 
	while ((os.time() <= endtime) and (simu == "1")) or ((manualOveride == "1")) do 
		-- original code: while ((os.time() <= endtime) and (simu == "1")) or ((os.time() <= endtime) and (simu == "1") and (manualOveride == "1")) do 
		if time == endtime then StandardDebug("time and endtime same value -> end") 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 
		StandardDebug('light ID:'..random_light..' status:'..lightstatus) 
		local sleeptime = math.random(rndmaxtime*60000) --random sleep 
		fibaro:debug("entering loop of " .. sleeptime/60000 .. "minutes")
		-- This modification allows to exit the scene if the Simu_presence global var changes to 0 during the random  sleep
			local counterexitsimu = 200
				while (counterexitsimu > 0) do
					counterexitsimu = counterexitsimu - 1;
					test_presence_state = fibaro:getGlobal("Simu_presence")
					simu = tonumber(test_presence_state); --verify the global value, if the virtual device is deactivated, the scene stops. 
					--fibaro:debug("simu var state : " .. simu)
					if simu == 0 then
						counterexitsimu = 0
					end
				fibaro:sleep(sleeptime/200) 
				end
			fibaro:debug("exiting loop of " .. sleeptime/60000 .. "minutes")
		local sleeptimemin = math.abs(sleeptime/60000) 
		StandardDebug('sleeptime:'..sleeptimemin) 
		simu = fibaro:getGlobal("Simu_presence"); --verify the global value, if the virtual device is deactivated, the scene stops. 
		manualOveride = fibaro:getGlobalValue("overideSimuSunset") 
	end 
	end 


-- Main Script beginning 

SimulatorPresenceEngine:EndTimeCalc(); 

if (simu == "1") then 
	Debug("green", "Simulate Presence at Home | v" .. version ); 
	Debug( "green", "--------------------------------------------------"); 
	ExtraDebug("Today's sunset: "..fibaro:getValue(1, "sunsetHour")) 
end 

if (simu == "1") then 
	Debug("grey", "Simulate Presence will start at "..start_simu) 
	pushMessage("Simulate Presence will start at "..start_simu)
end 

-- Main Loop 
while (simu=="1") do 
	-- Condition to start simulation 
	simu = fibaro:getGlobal("Simu_presence"); 
	manualOveride = fibaro:getGlobal("overideSimuSunset"); 

	if (os.date("%H:%M") >= start_simu) then 
		sunset = 1 
	else 
		sunset = 0 
	end 

	if ((simu == "1") and os.time() <= endtime and sunset == 1 ) or ((simu == "1") and manualOveride == "1" ) then 
		SimulatorPresenceEngine:Launch(); --launch the simulation. 
		if manualOveride == "1" and sunset == 0 then 
			Debug("grey", "Manual override activated") 
		elseif sunset == 1 then 
			Debug("grey", "It's sunset time, starting simulation") 
		end 

		if sunset == 0 and manualOveride == "0" then 
			Debug("grey", "Not manual override so Presence Simulation will not be activated"); 
		elseif os.time() >= endtime then 
			Debug("grey", "Time is now after:"..stop_hour..":"..stop_minute.."deactivating"); 
			SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
			Debug("red","Simulation is deactivated") 
			pushMessage("Lights simulation stopped") 
		end 
	end 
end 

-- Condition to end simulation 
if (simu == "0") then 
	SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
	Debug("red","Simulation is deactivated") 
	pushMessage("Lights simulation stopped") 
end 
Debug("red","Exit from scene") 

Lien vers le commentaire
Partager sur d’autres sites

@sebcbien,

J'utilise déjà  depuis quelques semaines ton script que j'ai pris sur le forum Officiel. 

En effet, je suis souvent en déplacement, et pour moi ce script est super bien fait, merci en tout cas.

Cependant, as tu pu observer le problème suivant:

- Etant absent plusieurs jours de suite, je lance la simu par l'intermédiaire du VD, le script m'annonce le début de la simu à  l'heure du Sunset comme prévue. La sim s'arrête bien à  l'heure voulue, mais le lendemain, je suis obligé de relancer la sim si veux que cela fonctionne.

 

GEA m'aide bien dans ce cas, à  l'heure voulue, j'actionne le Off du VD Simu, le lendemain, je relance la Simu. 

Est ce normal ou bien une erreur chez moi.?

Lien vers le commentaire
Partager sur d’autres sites

Hmmm... C'est bien possible mais je ne l'avais jamais remarqué. C'est vrai que je ne suis généralement absent que 1 jour ou deux. Difficile de regarder sur mon tel mais je jetterai un coup d'œil, le script sur lequel je me suis base n'était pas prévu pour tourner dans une scene.

Sent From my Vic20

Lien vers le commentaire
Partager sur d’autres sites

Voici la V 2.3, beaucoup de travail dessus, maintenant la scène tourne en permanence tant que la VG = 1  :)

Je ne sais pas tester en réel sur 2 jours, je compte sur vous pour me dire si ça tourne comme il faut  B)  :rolleyes:  -_-

Pour ne pas charger la HC1, j'ai mis une boucle d'attente de 5 minutes entre les vérifications

 

Petits rappels:

- L'arrêt en mettant la VG à  0, pendant une simulation l'arrête tout de suite et peut allumer une lampe dédiée

- L'arrêt à  lieu à  l'heure prévue + le temps restant de la dernière boucle d'attente (random de rndmaxtime)

 

 

debug de lancement:

[DEBUG] 01:50:50: Simulate Presence at Home | v2.3
[DEBUG] 01:50:50: --------------------------------------------------
[DEBUG] 01:50:50: Push message (Simulate Presence will start today at 17:27) sent to mobile: 53
[DEBUG] 01:50:50: Today''s sunset: 17:27
[DEBUG] 01:50:50: Simulation will stop: 01:10
[DEBUG] 01:50:50: Waiting for next Sunset -> Simulation OFF
[DEBUG] 01:50:50: sleeping 5min before re-check
[DEBUG] 01:55:50: Waiting for next Sunset -> Simulation OFF
[DEBUG] 01:55:50: sleeping 5min before re-check
--[[ 
%% autostart
%% properties 
%% globals 
Simu_presence 
--]] 

--------------------------------
-- YAPS Presence Simulator V2.3
-- SebcBien
-- Janvier 2015
--------------------------------
--V2.3
-- Rewriting the engine
-- now relaunch automatically the next day, even if Simu_presence has not changed
--V2.2
-- Added Manual Stop variable
-- added list of mobiles

if (fibaro:countScenes() > 1) then 
	fibaro:debug("More than one scene active, exiting!"); 
	fibaro:abort(); 
end 
		
--------------------- USER SETTINGS -------------------------------- 
local id = {
	LAMPE_SDB			= 16,
	LAMPE_CH_AMIS		= 24,
	LAMPE_SALON			= 45,
	LAMPE_BUREAU		= 49,
	LAMPE_HALL			= 52,
	LAMPE_CELLIER		= 56,
	LAMPE_CH_EMILIEN	= 58,
	PHONE_NEXUS_5		= 53,
	PHONE_NEXUS_4		= 104
	}
  
local stop_hour = "01"; -- Hour when you want simulation to stop 
local stop_minute = "23"; -- Minute of the hour you want simulation to stop 
-- note 1: the script will not exit while waiting the random time of the last light turned on. So end time can be longer than specified end time
-- note 2: if the global variable changes during the same wait time as above, it will exit immediately (when back home while simulation runs)
local rndmaxtime = 15 -- random time of light change in minutes --> here each device is on maximum 30min 
local ID_devices_lights = {id["LAMPE_SDB"],id["LAMPE_BUREAU"],id["LAMPE_HALL"],id["LAMPE_CELLIER"],id["LAMPE_CH_AMIS"]} -- IDs of lights to use in simulation 
--local ID_devices_lights = {id["LAMPE_BUREAU"],id["LAMPE_CELLIER"]} -- IDs of lights to use in simulation
local activatePush = true; -- activate push when simulation starts and stops 
--local ID_Smartphone = 53; -- ID of your smartphone 
--local ID_Smartphones = {id["PHONE_NEXUS_5"],id["PHONE_NEXUS_4"]}; 
local ID_Smartphones = {id["PHONE_NEXUS_5"]}; 
local ID_On_After_Simu = id["LAMPE_HALL"] -- Only One ID of a lamp to turn on after simulation ends (set 0 to disable)
local Manual_Stop = 1 -- 0 will not turn on the lamp "ID_On_After_Simu" at the end of the script. Replace this variable by a global value if you want to automate
--------------------- USER SETTINGS END ---------------------------- 
----------------------ADVANCED SETTINGS----------------------------- 
local showStandardDebugInfo = true; -- Debug shown in white 
local showExtraDebugInfo = true; -- Debug shown in orange 
local numbers_lights = #ID_devices_lights -- numbers of light devices listed above 
local manualOveride = fibaro:getGlobal("overideSimuSunset"); -- if = 1 then the simulation is forced
-------------------------------------------------------------------- 
----------------------------------- 
----- Do not change code below ---- 
----------------------------------- 
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 endtime 
version = "2.3" 
if (simu == "0") then 
  fibaro:debug("No need to start scene, simu = 0, Exiting") 
  fibaro:abort(); 
end

SimulatorPresenceEngine = {}; 

-- debug function 
Debug = function ( color, message ) 
		fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); 
	end 

ExtraDebug = function (debugMessage) 
	if ( showExtraDebugInfo ) then 
		Debug( "orange", debugMessage); 
	end 
	end 

StandardDebug = function (debugMessage) 
	if ( showStandardDebugInfo ) then 
		Debug( "white", debugMessage); 
	end 
	end 

-- function push message to mobile 
pushMessage = function (sendPush) 
	if (activatePush) then 
    for i=1, #ID_Smartphones do 
      fibaro:call(tonumber(ID_Smartphones[i]), 'sendPush', sendPush); 
      ExtraDebug("Push message ("..sendPush..") sent to mobile: "..tonumber(ID_Smartphones[i])); 
    end 
	end 
	end
-- function to calculate endtime 
function SimulatorPresenceEngine:EndTimeCalc() 
	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 
	endtime = os.time{year=year, month=month, day=day, hour=stop_hour, min=stop_minute, sec=sec} 
	start_simu = fibaro:getValue(1, "sunsetHour"); -- recalculate for next day
	--ExtraDebug ("Current OS Time" ..os.time()) 
	--ExtraDebug ("Original planed EndTime " ..endtime) 
	--[[if endtime < os.time() then 
		endtime = endtime + 24*60*60 
		ExtraDebug ("Modified Endtime +24h " ..endtime) 
	end --]]
	end 
-- function to simulate a presence 
function SimulatorPresenceEngine:Launch() 
	pushMessage("Lights simulation started, will stop at: "..stop_hour..":"..stop_minute) 
	ExtraDebug("Lights simulation started, will stop at: "..stop_hour..":"..stop_minute ); 
	while ((os.time() <= endtime) and (simu == "1")) or ((manualOveride == "1")) do 
		-- original code: while ((os.time() <= endtime) and (simu == "1")) or ((os.time() <= endtime) and (simu == "1") and (manualOveride == "1")) do 
		if time == endtime then StandardDebug("time and endtime same value -> end") 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 
		StandardDebug('light ID:'..random_light..' status:'..lightstatus) 
		local sleeptime = math.random(rndmaxtime*60000) --random sleep 
		fibaro:debug("entering loop of " .. sleeptime/60000 .. "minutes")
		-- This modification allows to exit the scene if the Simu_presence global var changes to 0 during the random  sleep
			local counterexitsimu = 200
				while (counterexitsimu > 0) do
					counterexitsimu = counterexitsimu - 1;
					test_presence_state = fibaro:getGlobal("Simu_presence")
					simu = tonumber(test_presence_state); --verify the global value, if the virtual device is deactivated, the scene stops. 
					--fibaro:debug("simu var state : " .. simu)
					if simu == 0 then
						counterexitsimu = 0
					end
				fibaro:sleep(sleeptime/200) 
				end
			fibaro:debug("exiting loop of " .. sleeptime/60000 .. "minutes")
		local sleeptimemin = math.abs(sleeptime/60000) 
		StandardDebug('sleeptime:'..sleeptimemin) 
		simu = fibaro:getGlobal("Simu_presence"); --verify the global value, if the virtual device is deactivated, the scene stops. 
		manualOveride = fibaro:getGlobalValue("overideSimuSunset") 
	end 
	end 
	
function SimulatorPresenceEngine:EndSimulation() 
	SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
	Debug("red","Simulation is deactivated") 
	--ExtraDebug("Tomorrow sunset: "..fibaro:getValue(1, "sunsetHour"));
	if (simu == "1") then
		Debug("grey", "Simulate Presence will Restart tomorrow at "..start_simu)
		pushMessage("Simulate Presence will Restart tomorrow at "..start_simu)
	end
end

function SimulatorPresenceEngine:ExitSimulation() 
	SimulatorPresenceEngine:TurnOff(ID_devices_lights); 
	Debug("red","Presence Simulator is Terminated") 
	pushMessage("Presence Simulator is Terminated") 
end

-- function to switch off devices in the list 
function SimulatorPresenceEngine:TurnOff(group) 
	Debug("red","TurnOff All lights!") 
	local name, id2; 
	local ID_devices_group = group; 
	for i=1, #ID_devices_group do 
	id2 = tonumber(ID_devices_group[i]); 
	fibaro:call(id2, "turnOff"); 
	name = fibaro:getName(id2); 
	if (name == nil or name == string.char(0)) then 
		name = "Unknown" 	
	end 
	StandardDebug("Device:" .. name .. " Off "); 
	end 
	  if (ID_On_After_Simu ~= 0 and Manual_Stop == 1) then
	  fibaro:call(ID_On_After_Simu, "turnOn"); 
	  end
	end 

Debug("green", "Simulate Presence at Home | v" .. version ); 
Debug( "green", "--------------------------------------------------"); 
pushMessage("Simulate Presence will start today at "..start_simu)
ExtraDebug("Today's sunset: "..fibaro:getValue(1, "sunsetHour"));
ExtraDebug( "Simulation will stop: "..stop_hour..":"..stop_minute ); 
while (simu=="1" or simu=="0" ) do 
	SimulatorPresenceEngine:EndTimeCalc(); 
	--local start_simu = "00:01"  -- uncomment this line when testing to force a start hour 1 min after saving the scene.

	-- define if  nighttime (sunset)
	if (os.date("%H:%M") >= start_simu) then 
		sunset = 1 
	else 
		sunset = 0 
	end 

	if sunset == 1 and (os.time() >= endtime) then 
		ExtraDebug("Simulation ended for this night.") 
	end 

	if (simu == "1") then 

		if sunset == 1 and os.time() <= endtime then 
			Debug("grey", "It's sunset time -> Simulation ON")
			SimulatorPresenceEngine:Launch(); --launch the simulation. 
			SimulatorPresenceEngine:EndSimulation();
		end 

		if manualOveride == "1" then 
			Debug("grey", "Manual Override Activated -> Simulation ON")
			SimulatorPresenceEngine:Launch(); --launch the simulation. 
			SimulatorPresenceEngine:EndSimulation();
		end
			--fibaro:debug("sunset: "..sunset .. "endtime: " .. endtime .. "ostime: " .. os.time())
		if manualOveride == "0" and sunset == 0 then 
			Debug("grey", "Waiting for next Sunset -> Simulation OFF"); 
		end
	end 
	
	-- Condition to end simulation 
	if (simu == "0") then 
		SimulatorPresenceEngine:ExitSimulation() ;
		Debug("red","Simu = 0, Exit from scene") 
		fibaro:abort(); 
	end
	
	fibaro:debug("sleeping 5 min before re-check")
	fibaro:sleep(5*60*1000);
	simu = fibaro:getGlobal("Simu_presence"); 
	manualOveride = fibaro:getGlobal("overideSimuSunset"); 
end

 

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...