sebcbien Posté(e) le 6 janvier 2015 Signaler Posté(e) le 6 janvier 2015 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: 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: 1 3
Did Posté(e) le 6 janvier 2015 Signaler Posté(e) le 6 janvier 2015 Tu as peut-être amélioré des fonctions mais on en parle déjà ici: http://www.domotique-fibaro.fr/index.php/topic/198-simulation-de-pr%C3%A9sence/
sebcbien Posté(e) le 6 janvier 2015 Auteur Signaler Posté(e) le 6 janvier 2015 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...
Did Posté(e) le 6 janvier 2015 Signaler Posté(e) le 6 janvier 2015 Pardon, je n'avais pas vu jusqu'à la fin.
pir2d2 Posté(e) le 7 janvier 2015 Signaler Posté(e) le 7 janvier 2015 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
sebcbien Posté(e) le 7 janvier 2015 Auteur Signaler Posté(e) le 7 janvier 2015 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. 1
jompa68 Posté(e) le 7 janvier 2015 Signaler Posté(e) le 7 janvier 2015 le script a été améliorée Skickat från min iPhone med Tapatalk
carfnann Posté(e) le 22 janvier 2015 Signaler Posté(e) le 22 janvier 2015 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
sebcbien Posté(e) le 22 janvier 2015 Auteur Signaler Posté(e) le 22 janvier 2015 Heure d'arrêt, ici 3h40 du matin :-) Sent From my Vic20
carfnann Posté(e) le 22 janvier 2015 Signaler Posté(e) le 22 janvier 2015 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...
sebcbien Posté(e) le 22 janvier 2015 Auteur Signaler Posté(e) le 22 janvier 2015 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
banzai861 Posté(e) le 22 janvier 2015 Signaler Posté(e) le 22 janvier 2015 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.
sebcbien Posté(e) le 22 janvier 2015 Auteur Signaler Posté(e) le 22 janvier 2015 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
sebcbien Posté(e) le 22 janvier 2015 Auteur Signaler Posté(e) le 22 janvier 2015 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
sebcbien Posté(e) le 22 janvier 2015 Auteur Signaler Posté(e) le 22 janvier 2015 le push de démarrage de simulation indique toujours la même heure (16h22). C'est le comportement voulu, c'est l'heure du coucher de soleil. il change de jour en jour, mais pas d'heure en heure
banzai861 Posté(e) le 22 janvier 2015 Signaler Posté(e) le 22 janvier 2015 ... 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
sebcbien Posté(e) le 22 janvier 2015 Auteur Signaler Posté(e) le 22 janvier 2015 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...
banzai861 Posté(e) le 23 janvier 2015 Signaler Posté(e) le 23 janvier 2015 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.
pir2d2 Posté(e) le 23 janvier 2015 Signaler Posté(e) le 23 janvier 2015 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 ?
sebcbien Posté(e) le 23 janvier 2015 Auteur Signaler Posté(e) le 23 janvier 2015 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)
sebcbien Posté(e) le 23 janvier 2015 Auteur Signaler Posté(e) le 23 janvier 2015 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
sebcbien Posté(e) le 23 janvier 2015 Auteur Signaler Posté(e) le 23 janvier 2015 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")
Arbu-jl Posté(e) le 24 janvier 2015 Signaler Posté(e) le 24 janvier 2015 @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.?
sebcbien Posté(e) le 24 janvier 2015 Auteur Signaler Posté(e) le 24 janvier 2015 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
sebcbien Posté(e) le 28 janvier 2015 Auteur Signaler Posté(e) le 28 janvier 2015 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 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
Messages recommandés