Krikroff Posté(e) le 13 février 2014 Signaler Posté(e) le 13 février 2014 Pour tester l'heure soit tu fais une convention en timestamp pour travailler sur du numérique soit tu utilises os.difftime (t2, t1)... http://www.lua.org/pil/22.1.html L'utilisation d'une variable jour / nuit n'est pas inintéressante bien au contraire, àtoi de voir ! Envoyé de mon iPhone.
Romain80 Posté(e) le 13 février 2014 Signaler Posté(e) le 13 février 2014 Merci. Je vais tenter avec le script que tu as posté pour justement avoir cette variable globale qui comme tu le dis n'est pas ininterressant, et qui je suis sur pourra reservir. Concernant les cast, je ne suis pas super a l'aise avec ce genre de manip en LUA. Par contre, dois je creer une variable globale sunsetHour dans le panneau des variables ? Je lui applique 2 valeurs possibles, True et False ? 0 et 1 ? Juste pour etre sur d'avoi bien tout compris ! Encore merci
Krikroff Posté(e) le 13 février 2014 Signaler Posté(e) le 13 février 2014 Moi j'ai une variable prédéfinie "Phases journée" avec Jour et Nuit. Cette variable est mise à jour avec une scène. Mais une variable simple marche très bien aussi par ex: "sunsetHour" avec comme valeur 0, mis à jour aussi avec une scène. Pour le CAST en Lua je fais souvent cela : local currentTime = tonumber(os.date("%H%M")); if (currentTime >= tonumber(string.format("%02d%02d", "11", "00"))) then -- TODO ... end pour la mise à jour de la variable je ferais un truc comme ça... Ps: il y a des debugs pour bien comprendre ... local currentTime = os.date("%H%M"); fibaro:debug("currentTime: " .. tonumber(currentTime)); local sunriseHour = string.gsub(fibaro:getValue(1, 'sunriseHour'), ":", ""); fibaro:debug("sunriseHour: " .. tonumber(sunriseHour)); local sunsetHour = string.gsub(fibaro:getValue(1, "sunsetHour"), ":", ""); fibaro:debug("sunsetHour: " .. tonumber(sunsetHour)); if (tonumber(currentTime) >= tonumber(sunriseHour) and tonumber(currentTime) <= tonumber(sunsetHour)) then fibaro:debug("Day Time..."); else fibaro:debug("Night Time..."); end
Romain80 Posté(e) le 13 février 2014 Signaler Posté(e) le 13 février 2014 Merci. Je vais tenter avec la scene proposée un peu plus haut qui permettra de placer sunsetHour sur True. Je vais donc essayer avec une variable globale "sunsetHour" qui aura 2 valeurs possibles : True ou False. Et on verra bien. Je posterai mes resultats ce soir ... Quand l'horraire de sunset sera reach
Romain80 Posté(e) le 17 février 2014 Signaler Posté(e) le 17 février 2014 Salut, Apres plusieurs jours de tests et de prises de tete pour réussir a faire fonctionner correctement ce script chez moi, je viens vous donner ma solution. Ce n'est certainement pas la meilleure solution ni la plus aboutit techniquement mais en attendant ça fonctionne Si quelqu'un comme moi, novice, passe par la en voulant mettre en place ce script a priori cela ne devrait pas fonctionner car il manque des pre-requis et surtout, sans critiquer le code existant, mais celui ci comportait des incoherences. Voici donc, étape par étape ce que j' ai fait grace aux conseils et a diverses sources pour faire fonctionner la simulation de presence chez moi. Tout d' abord, il faut créer 2 variables globales comme ceci : La variable sunsetHour pourra prendre comme valeur 0 ou 1 grace a une scene que l' on verra juste en dessous. La variable Simu_presence aura comme valeurs ON et OFF Ensuite, il nous faudra donc les 2 scenes qui permettront de modifier la valeur de sunsetHour sur 0 ou 1 en fonction (en fonction de l'heure de coucher et de lever de soleil) Il nous reste a nous attaquer au périphérique virtuel : Code du bouton ON --[[ %% 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(23, "setProperty", "ui.status.value", "Activée"); --fibaro:debug(fibaro:getValue(23, "ui.status.value")) Code du bouton OFF --[[ %% 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(23, "setProperty", "ui.status.value", "Désactivée"); --fibaro:debug(fibaro:getValue(23, "ui.status.value")) Code du main loop --[[ %% autostart %% properties %% globals Simu_presence --]] -- LUA - Presence Simulator V1.0.2 -- -- 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....esence&start=15 -- and here thx to Krikroff http://forum.fibaro....opic.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 = 12; -- 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 = 4; --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 transition_hour = 12; -- Hour of the transition time to avoid the simulation restart automatically after midnight local transition_min = 00; -- Minute of the transitin's time hour local simu = fibaro:getGlobal("Simu_presence"); --value of the global value: simulation is on or off local start_simu = fibaro:getGlobal("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} local transitionTime = os.time{year=year, month=month, day=day, hour=transition_hour, min=transition_min, sec=sec} local sunset = fibaro:getGlobal("sunsetHour"); SimulatorPresenceEngine = { version = "1.0.2" }; -- 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 ((simu == "On") and os.time() <= endtime and os.time() >= transitionTime and sunset == "1" ) then 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") elseif os.time() <= transitionTime then fibaro:debug("Simulation will start once the sunset hour reached") end if (simu == "Off") then fibaro:debug("Simulation is deactivated") end Mes modifications se situe aux lignes suivantes par rapport au code d'origine : Lignes : 38, 39, 50, 51 J' ai également opté pour une "heure de transition" dans le but de renforcer le test de depart de la simulation et ainsi éviter que celui ci se relance automatiquement après minuit si elle n'est pas coupée. j' ai placé l'heure de transition a 12:00 (A midi, on est certain que le soleil est levé tout comme on est certain qu' a midi il y a peut de chance que le soleil se couche) Voila normalement dans cette version tout doit fonctionner normalement. ++ 1
lolomail Posté(e) le 18 février 2014 Signaler Posté(e) le 18 février 2014 Question, je comprends le pbs avec le passage àminuit, mais avec la scène avec le bouton OFF cela ne veuit pas dire qu'il faut engager la simul chaque jour en cas de départ en vacances?
Romain80 Posté(e) le 18 février 2014 Signaler Posté(e) le 18 février 2014 Salut lolomail, Alors effectivement dans la configuration actuelle cela implique une reactivation manuelle tous les jours. Pour régler le problème, on peut imaginer une scene qui lancera la simulation tous les jours. Sinon il est vrai qu' a la base c'est un simulateur "vacances". Je vais donc voir pour modifier la condition de depart de la simulation et voir si je peux faire en sorte que celle ci se lance correctement tous les jours (et se coupe) sans intervention manuelle.
Marty25 Posté(e) le 18 février 2014 Signaler Posté(e) le 18 février 2014 Salut, Ne serait il pas plus simple de passer la variable sunsethour à 0 dès l'heure de fin. Elle ne repassera à 1 qu'au moment du coucher du soleil. A+
Romain80 Posté(e) le 18 février 2014 Signaler Posté(e) le 18 février 2014 Oui par exemple. je vais voir pour modifier tout ça pour que le périphérique virtuel soit autonome. EDIT : Apres reflexion non ce ne sera pas une bonne solution. Le fait de conserver la coherence de notre variable sunsetHour lui permet d'être réutiliser dans d'autres modules ou scenes. Mais on va faire autrement
Romain80 Posté(e) le 18 février 2014 Signaler Posté(e) le 18 février 2014 Voila, J' ai apporté quelques modifications. j' ai supprimé la scene qui coupe la simu. Tout ce gère automatiquement maintenant. j' ai edité mon post avec le "tuto". Enjoy
p78ch201 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 Bonjour, je pense avoir suivi le tuto correctement, mais je n'ai n'ai pas mon périphérique virtuel affiché avec les 2 boutons. J'obtiens ceci : (sur l'ecran ma maison et sur l'ecran mes modules), pour avoir le bouton : je dois aller dans la configuration du module. Est-ce le fonctionnement normal ? ou je devrais avoir la deuxième image dans la liste des modules ? Je reviens sur la première : quand je suis en mode "désactivé", je clique sur l'unique bouton disponible et le module passe sur activé. si je reclique dessus, le module reste en "activé", pour le désactiver, je dois aller dans les paramètres du module et cliquer sur off.
Romain80 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 Salut, Alors effectivement c'est pareil chez moi. Je n' ai jamais réussis a créer un périphérique virtuel avec autre chose que le bouton unique sur le module. E revanche tu peux définir quelle sera l'action qui sera effectuée en cliquant sur "Main" ou sur Favorite je ne sais plus dans le parametrage des boutons. Mais sinon pas besoin d' aller dans le parametrage a chaque fois. Sur les periph virtuels tu verras un autre petit icône a coté de la clef de parametrage. Clique dessus, cela va deployer un menu avec tous les boutons dispo.
p78ch201 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 OK, merci pour l'info. J'ai d'ailleurs repris ton code, je vais essayer de tester tout ça ! bravo a tous les participants pour ce module !!
Romain80 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 De rien. Ok ba ecoute tu me diras si ça fonctionne correctement. Et c'est avec plaisir si je peux aider !
Domodial Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 J'utilise ce script depuis cette été mais je n'ai rien relevé d'anormal (forcément je n'était pas là ), mais en regardant a distance avec les caméras et les états des lampes ça fonctionnait. Mais ce que tu relèves me fait dire que je vais essayer ta version Merci pour le partage.
Romain80 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 Oula, le membre du mois qui teste "ma" version ... j' ai la pression En tout cas, j'attend ton retour. Chez moi ça marche très bien depuis mes petites motifs, j'espère que cela fonctionnera chez toi !
clarkkent609 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 @p78ch201 Effectivement c'est normal, et comme l'indique Romain80 il faut cliquer sur l'icône avec les 4 flèches àgauche du bouton configuration du module pour voir le VD s'afficher sans devoir passer par le panneau de config. Pour choisir l'action du seul bouton de l'interface globale, il faut sélectionner le bouton "radio" intitulé "Main" dans la config du module virtuel, pour le bouton de ton choix.
p78ch201 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 merci pour l'info. autre question, dans la ligne local ID_devices_lights = {29,33,34} --IDs of lights to use in simulation faut-il nécessairement que les modules soient des lumières ? (ou ça marche aussi avec des interrupteurs, je pense que oui, mais j'ai pas encore tester vu que je n'ai pas eu le temps d'installer les modules derrière mes inter) J'image qu'il serait également possible de rajouter des volets roulants dans le script ? Est-ce qu'on peut considérer les volets roulants comme des lumières dans ce script ? (meme si je pense qu'il faille adapter les différentes variables avec d'autres plages horaires pour les volets...)
clarkkent609 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 En fait ça fonctionne dès lors que tu peux commander ton device avec cette commande, en turnOn ou turnOff. . fibaro:call(id, "turnOff");Un wallplug ça fonctionne, les modules prises aussi en général (j'ai pas tous les modèles), les fgd aussi etc. Si tu peux faire la même commande avec un volet c'est gagné. Par contre si tu mets un volet il peut s'ouvrir et se fermer plusieurs fois pendant la simulation ce qui àmon avis n'est pas le but recherché.
Romain80 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 Oui tout a fait, concernant les volets, si tu les places dans la liste des Id (et c'est a supposer que la fonction "turnOff" fonctionne pour les volets, ce dont je ne suis pas sur du tout), tes volets vont "subir" le random et par consequent d'ouvrir et se fermer de manière aléatoire pendant toute la durée de la simu. Pas très "réaliste" comme comportement. Sauf si tu as pour habitude d'ouvrir et fermer tes volets plusieurs fois en soirée Plus sérieusement, en revanche, on peut imaginer un ajout dans le script qui fermera tes volets a une heure aléatoire pendant la simulation. Si cela t'interresse, je peux jeter un oeil pour rajouter cette partie. Personnellement, j' utilise un autre script tout a fait lambda qui ferme mes volets tous les soirs 20 min après l'heure de couché du soleil. Mais après on peut tout t'imaginer.
p78ch201 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 effectivement, ça ferait louche L'idée était de programmer l'ouverture aléatoire des volets sur une plage de temps prédéfini (par exemple entre 8 et 9), idem pour la fermeture, avec des paramètres différents le week end. En maitrisant le code LUA, on peut effectivement tout imaginer, il va falloir que je me penche sérieusement dedans quand j'aurais fini de faire l'installation.
Romain80 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 Tu voudrais associer l'ouverture aléatoire des volets au scenario de simu de presence, c'est bien ça. Quand la scene sera desactivée, tes volets suivront un autre scenario ou une ouverture manuelle, correcte ??
p78ch201 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 c'est exactement ça ! parce que simuler la présence avec la lumière mais avec tous les volets fermés ....
clarkkent609 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 A mon avis, pour ne pas que ce VD se télescope avec un scénario quotidien d'ouverture de volet, je pense qu'il sera nécessaire d'introduire une variable "Vacances". En temps normal, le scénario quotidien fonctionne si l'état de la variable Vacances est àoff. Le VD quant àlui mets la variable àOn pour éviter que le scénario quotidien se déclenche, et gère l'ouverture et fermeture aléatoire dans un créneau horaire choisi.
p78ch201 Posté(e) le 8 mars 2014 Signaler Posté(e) le 8 mars 2014 Juste pour voir si je commence à comprendre qqch au LUA il faudrait rajouter sur le bouton "ON" fibaro:setGlobal("Vacances", "On") et sur le bouton "OFF" fibaro:setGlobal("Vacances", "Off") et utiliser la variable condition Vacances = Off pour les autres scénarios du coup, je me dis qu'il doit être possible de coupler ça avec un calendrier. (attention aux vacances passées à la maison avec le simulateur de présence qui se met en marche tout seul....)
Messages recommandés