Aller au contenu

Voir Si Une Lumière Est Allumée Et Tout Éteindre


neliger

Recommended Posts

Le voici avec en bonus le code pour fixer une valeur et en ajouter 2 dans la liste prédéfinie.

-- Creation de Variable Gazous
json = '{"name":"Gazous", "isEnum":1}'
HC2 = Net.FHttp("127.0.0.1", 11111)
HC2:POST("/api/globalVariables", json)

-- Ajout de 2 valeurs àla Variable Gazous et modification avec une des 2 valeurs
json = '{"value":"Gazous1","isEnum":true,"enumValues":["Gazous1", "Gazous2"]}'
HC2:PUT("/api/globalVariables/Gazous", json)
  • Upvote 2
Lien vers le commentaire
Partager sur d’autres sites

Super merci Gazous je vais testé cela demain Je vais peux être faire un tuto avec ce genre de code si je mets ton mon comme auteur de ce script ca te vas?

Envoyé de mon SM-G900F en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Je confirme ce qui semblait évident : en basculant tout le code de la MainLoop dans un bouton et en faisant un pressbutton dans la MainLoop, ça ne plante plus.

Le souci c'est que durant la durée d'exécution du code du bouton, c'est l'icône du bouton qui s'affichera donc pas forcément très esthétique...

 

Il serait quand même bien de comprendre ce qui génère le blocage dans la MainLoop !

Lien vers le commentaire
Partager sur d’autres sites

Je te proposes mon code actuel qui tourne très bien

 

Premier button "Tout Eteindre"

-- Récupération de la liste des modules
HC2 = Net.FHttp("127.0.0.1", 11111)
reponse = HC2:GET("/api/devices")
json = json.decode(reponse)

-- Modules à  exclure et fonction de traitement (pas raccordés à  des lumières)
-- Peut contenir un id ou un mot clés à  chercher dans le nom du module
toExclude = {72, "Dispo", "Volet", "Bubendorff"}

function shouldExclude(module)
    for k, v in pairs(toExclude) do
    	if string.find(module.name, v) ~= nil or module.id == v then return true end
    end
	return false
end

-- Boucle sur les modules
for k, v in ipairs(json) do
	if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" and not shouldExclude(v) then
		if v.properties.value == "true" then
			fibaro:call(v.id, "turnOff")
		elseif v.properties.value ~= nil and v.properties.value ~="false" then
			if tonumber(v.properties.value) > 0 then
				fibaro:call(v.id, "turnOff")
			end
		end
	end
end

Deuxième bouton "Rafraîchir"

-----------------------------------------------------------
-- Toutes lumières v1.3
-----------------------------------------------------------
-- Extinction de l'ensemble des lumières de la maison
-----------------------------------------------------------
-- Changelog
-- 1.3 : Liste d'exclusion pouvant contenir des id de modules ou des mots clés dans les noms
-- 1.2 : Correction du test d'état prenant en charge les
--       modules variateurs et rétablissement de la
--       condition pour l'exctinction
-- 1.1 : Extinction inconditionnelle et prise en charge des
--       modules variateurs
-----------------------------------------------------------

------------------------------
-- Variables à  renseigner
------------------------------

-- Identiants des icônes
IconeAllume = 1030
IconeEteint = 1031

function debug(text, color)
  color = color or "white"
  fibaro:debug("<font color='"..color.."'>"..text.."</font>")
end

-- Modules à  exclure et fonction de traitement (pas raccordés à  des lumières)
-- Peut contenir un id ou un mot clés à  chercher dans le nom du module
toExclude = {72, "Dispo", "Volet", "Bubendorff"}

function shouldExclude(module)
    for k, v in pairs(toExclude) do
    	if string.find(module.name, v) ~= nil or module.id == v then return true end
    end
	return false
end

function checkLights()
  -- Variable du compteur
  compteurLumieres = 0
   
  -- Récupération de la liste des modules
  HC2 = Net.FHttp("127.0.0.1", 11111)
  reponse = HC2:GET("/api/devices")
  jsonResponse = json.decode(reponse)
   
  -- Boucle sur les modules
  for k, v in ipairs(jsonResponse) do
      if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" and not shouldExclude(v) then
          if v.properties.value == "true" then
              compteurLumieres = compteurLumieres + 1
          elseif v.properties.value ~= nil and v.properties.value ~="false" then
              if tonumber(v.properties.value) > 0 then
                  compteurLumieres = compteurLumieres + 1
              end
          end
      end
  end
   
  -- Mise à  jour de l'icône
  if(compteurLumieres > 0) then
      fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeAllume)
      debug(compteurLumieres.." lumière(s) allumée(s)", "green")
  else
      fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint)
      debug("Aucune lumière allumée")
  end
end
  
pcall(checkLights)

MainLoop

fibaro:call(fibaro:getSelfId(), 'pressButton', '2')
Lien vers le commentaire
Partager sur d’autres sites

voici un solution que j'utilise dans le main loop d'un vd pour appuyer sur un bouton

Attention si on utilise un SLEEP il faut éviter de faire des sleep supérieur a 30 mn (risque de blocage)

se script appui sur le bouton toute les Heures a adapter a vos besoin

while true do
   local Var_Heure = os.date("%H:%M")
   fibaro:debug("heure OS : " ..Var_Heure)
   if Var_Heure == "00:01" then
      fibaro:call(fibaro:getSelfId(), "pressButton", "1")
   end
   fibaro:sleep(60*1000)
end
Lien vers le commentaire
Partager sur d’autres sites

@mprinfo

en fait, j'avais deja pensé à  utiliser ton code, car j'ai deja piqué des VD à  toi  :P

mais etant pas tres bon, je me suis vite perdu!

Avec ton code, comment creer un appui toutes les 10 secondes?

Lien vers le commentaire
Partager sur d’autres sites

la tu veux toutes le x seconde ou x minutes

 

avec os.date() on récupére l'heure systéme et on appui sur le bouton au des heures, minutes, secondes bien précise

 

tu trouveras a la fin de ce totu toutes les possibilités de os.date : sunrisehour-sunsethour-osdate

Lien vers le commentaire
Partager sur d’autres sites

Je trouve sympa la solution de Trainkill et plutot simple à  gerer

 

Mais si on ne mettait rien dans le mainloop ;-) et que le code du mainloop allait dans le bouton "Mise à  jour"

 

Qu'en pensez-vous ?

 

Je viens de tester, ca fonctionne super, et avantage de cette soluce : les eclairages derrieres les WallPlugs sont pris en compte ;-)

 

Attention, il faut que les noms des eclairages respectent la casse ;-)

 

J'ai rajoute dans le bouton d'extinction des eclairages la mise a jour de l'icone ;-)

Lien vers le commentaire
Partager sur d’autres sites

@ pepite

 

Merci ;) .

 

Le main loop tourne en boucle pour la mise à  jour de l'icône d'état (allumé, éteint), il n'y a plus rien d'autre.

 

Pour le bouton d'extinction d'éclairage, il suffit de lui attribuer simplement l'icône identique à  celui "iconearret", ça évite de rajouter une ligne de code et de voir apparaître l'icône du cube bleu.

 

Si comme dans mon cas toutes tes modules d'éclairages contiennent un mot clé (éclairage ... par exemple) qui n'est pas présent dans les autres, je peux te donner la version du code j'utilise. Le programme cherche lui-même, pour ne pas à  avoir à  les rentrer.

Lien vers le commentaire
Partager sur d’autres sites

@trainkill : ah oui, pas bete le coup de l'icone, j'ai rajoute du code moi mais c'est beaucoup plus simple ta soluce.

 

Malheureusement pour moi je n'ai pas le terme eclairage pour chaque en fait mais je vais pe modif en les prefixant par une chaine aussi type "Ecl" ou "Lum" ou autres..

Je veux bien le code oui stp, ca gagne du temps quand c'est deja fait ;-) ..oui je sais j'en profite ;-)

 

@sakkho, tout pareil, GEA appuie sur les boutons pour moi, rien dans le mainloop et je vais rajouter la creation d'une variable pour etre averti et faire de la conditions multiples :

 

exemple :

 

Si Mode MAISON= ABSENCE depuis 5 mins : appui bouton RAFRAICHIR ce qui donne une valeur a une variable type VG : lumieres = ON

Si Mode MAISON= ABSENCE et LUMIERES = ON alors appui bouton extinction et envoi SMS

Lien vers le commentaire
Partager sur d’autres sites

@pepite

 

Voici le nouveau bouton "Mise à  jour" qui fonctionne par mot clé et ignore les modules virtuels (pour éviter tout risque d'erreur).

Il suffit simplement de mettre ton mot clé à  la place d'  "Eclairage" . Y'a pas plus simple. Puis un ptit clic sur le bouton. :)

-- Le code à  été placé en page 5 dans le post du 08 avril 2015 - 14:26 avec l'ensemble du module virtuel.
Lien vers le commentaire
Partager sur d’autres sites

Je confirme ce qui semblait évident : en basculant tout le code de la MainLoop dans un bouton et en faisant un pressbutton dans la MainLoop, ça ne plante plus.

Le souci c'est que durant la durée d'exécution du code du bouton, c'est l'icône du bouton qui s'affichera donc pas forcément très esthétique...

 

Il serait quand même bien de comprendre ce qui génère le blocage dans la MainLoop !

 

toujours pas trouvé la solution?  :rolleyes:

Lien vers le commentaire
Partager sur d’autres sites

@gazous Il y a un topic a ce sujet je sais plus ou mais il est préférable de mettre le code dans un bouton il faudrait que tu vois cela avec krikroff ou steven je pense qu'il y a des subtilités pour le main loop

Envoyé de mon SM-G900F en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

En fait, c'est très simple, l'appel à'pressButton" est protégé car il est asynchrone donc tu peux appeler 1000 fois la fonction, si jamais il y a eu un blocage dans les 1000 appels, cela n'aura pas bloqué les suivants puisque c'es la MainLoop qui appelle.

En mettant le code dans le bouton, il est probable que le blocage soit toujours là, mais on ne le voit plus.

C'est donc une solution de contournement qui ne résout pas le blocage :)

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

Il faudrait donc trouver ce qui bloc et gérer l erreur afin que çàne plante pas je sais que fibaro a mis 3s pour le mainloop car il y avait trop de problèmes

Envoyé de mon SM-G900F en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...