Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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

Posté(e)

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
Posté(e)

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

Posté(e)

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 : 

 

post-129-0-53224400-1392674948_thumb.png

 

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) 

 

post-129-0-59089100-1392675415_thumb.png

post-129-0-19802300-1392675417_thumb.png

 

Il nous reste a nous attaquer au périphérique virtuel :

 

post-129-0-34826300-1392675785_thumb.png

post-129-0-69887500-1392677697_thumb.png

post-129-0-27473800-1392675782_thumb.png

post-129-0-01745600-1392675784_thumb.png

 

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.

 

++

  • Upvote 1
Posté(e)

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?

Posté(e)

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.

Posté(e)

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 :)

Posté(e)

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 :)

  • 3 semaines après...
Posté(e)

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 :

 

mini_156648BoutonSimu.png

 

(sur l'ecran ma maison et sur l'ecran mes modules), pour avoir le bouton :

 

mini_627601BoutonSimu2.png

 

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.

Posté(e)

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.

Posté(e)

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

Posté(e)

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.

Posté(e)

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 !

Posté(e)

@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.

Posté(e)

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...)

Posté(e)

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é.
Posté(e)

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.

Posté(e)

effectivement, ça ferait louche :15:

 

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.

Posté(e)

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

Posté(e)

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.

Posté(e)

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....)

×
×
  • Créer...