Aller au contenu

Messages recommandés

Posté(e)

Pour la mise à  jour, remettre les commentaires, voir optimiser le code, je rends la main à  neliger, c'est son tuto, je ne suis qu'un intervenant, tout comme vous. :P

 

Sans lui je serais incapable de lister les modules du HC2 par json. ;)

 

Par contre, un chti " j'aime " sur mon post serait sympathique (je n'ai pas de dimmer). :60:

  • Upvote 2
Posté(e)

Je ne met pas à  jour tant que je ne comprend pas.

 

Précisément, je ne vois pas pourquoi type(v.properties.value) peut retourner string pour un dimmer alors que d'après mes tests c'était un numérique. D'ailleurs une comparaison avec une chaine retournait une erreur de type.

Posté(e)

Au fait pour contourner le déclenchement du modules dimmer ou on/off non utilisés pour l'éclairage, j'ai rajouté une condition au code :

if fibaro:getName(v.id):find("Eclairage") then

Car tous mes modules éclairages comporte ce terme dans le nom.

La récupération du "Name" peut se faire en json, mais làje passe mon tour. ;)

Posté(e)

@trankill666 : pour cette modif là  je ne l'ajouterais pas dans le module car cela dépend du nom des modules chez les utilisateurs, donc pas assez portable.

 

Le isLight n'était pas correct pour toi ?

Posté(e)

@trainkill666 un mamque d affection ou c'est la v4 qui te déprime ☺ c'est vrai que ca fais toujours plaisir

J'ai pas testé ton code car j'avais donner accès a ma box a neliger donc je ne touche pas au VD au cas ou il a besoin de refaire un test

Envoyé de mon SM-G900F en utilisant Tapatalk

Posté(e)

Malheureusement , j'ai plusieurs bugs depuis la 4.40 (comme je l'ai dit précedemment :( ), et la propriété isLight a disparu de tous mes modules, ainsi que leur affichage dans la section éclairage de l'appli android.

Le recovery s'approche à  grand pas.

J'utilise cette solution provisoire en attendant. :)

 

@mprinfo

oui ça fait plaisir.

Comme je t'avais dit dans le mp, après une bonne réinstalle, je pense que tout va tourner nickel.

J'attends juste un jour ou Madame n'est pas là . :P

Grâce à  neliger, je suis en train de me faire un chti code qui va restaurer automatiquement les ID des modules de toutes la maison (éclairage, chauffage, VMC, alarme, vidéo, modules virtuels,chauffe eau, ID appli android ...) dans les scènes, après la réinstallation. Il y aura moins de risque d'erreur, et surtout, je vais gagner beaucoup de temps à  la remise en route.

Posté(e)

Ok, je comprend mieux.

 

Pour le code distribué à  tous, on va rester sur le pré-requis que la box ne soit pas boguée ^^

 

@mprinfo : si tu le veux bien je me reconnecterais à  ta box ce soir, il faut que je comprenne ce problème de typage de la valeur de dimmer.

Posté(e)

@trainkill : il va falloir partager ce petit code ;-)

 

Sinon sache que @steven en a fait un qui permet de tous les récuperer aussi mais ce n'est pe pas le meme genre ;-)

Jette un oeil : c'est generateur d'IDS

 

http://www.domotique-fibaro.fr/index.php/topic/3477-g%C3%A9n%C3%A9rateur-did-pour-gea-ou-autre-script/page-2?hl=generateur#entry52747

Posté(e)

@trainkill666 si tu fais un recovery pourrais tu nous dire les versions encore en ligne chez fibaro Merci

Envoyé de mon SM-G900F en utilisant Tapatalk

Posté(e)

Oui c'est assez long comme manip si tu repasses en v4 soyons fou lol inclus tes modules en v4 ca sera plus propre au niveau des ID bon courage

Envoyé de mon SM-G900F en utilisant Tapatalk

Posté(e)

Bonsoir, je viens de tester ce VD qui fonctionne bien mais dans mon cas, j'ai un certain nombre de devices qui ne pilotent pas de lumières donc qu'il faudrait pouvoir les exclure.

J'ai donc de mon côté mis en place un tableau contenant les ID des modules à  exclure du traitement.

Voici le code que je propose pour cela.

 

Pour le bouton

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

-- Modules à  exclure et fonction du traitement (pas raccordés à  des lumières)
local idsToExclude = {10,36,38,39,41,44,56,59,61,72} 
function arrayContains(array, val)
	for k,v in pairs(array) do
    	if (v == val) 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 arrayContains(idsToExclude, v.id) 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

Pour la Mainloop

-----------------------------------------------------------
-- Toutes lumières v1.2
-----------------------------------------------------------
-- Extinction de l'ensemble des lumières de la maison
-----------------------------------------------------------
-- Changelog
-- 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
local IconeAllume = 1030
local IconeEteint = 1031

-- Intervalle de mise à  jour automatique (en secondes)
local IntervalleMAJ = 10
 
while true do
 
-- Variable du compteur
local compteurLumieres = 0
  
-- Modules à  exclure et fonction du traitement (pas raccordés à  des lumières)
local idsToExclude = {10,36,38,39,41,44,56,59,61,72} 
function arrayContains(array, val)
	for k,v in pairs(array) do
    	if (v == val) then return true end
    end
    return false
end
 
-- Récupération de la liste des modules
local HC2 = Net.FHttp("127.0.0.1", 11111)
local reponse = HC2:GET("/api/devices")
local json = json.decode(reponse)
 
-- 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 arrayContains(idsToExclude, v.id) 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)
else
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint)
end
 
-- Attente de la prochaine mise à  jour automatique
fibaro:sleep(IntervalleMAJ*1000)
 
end

Ca fonctionne bien chez moi.

Sinon ça me coupait des alimentations de volets roulant, mon caisson de basses etc...

  • Upvote 3
Posté(e) (modifié)

@ Gazous

bonne idée ;)

Voici une version sans connaître les IDs des modules àexclure, et en plaçant simplement les noms dans la listeexclusion comme dans l'exemple ci-dessous.

Version toujours non testée car j'ai toujours les bug de la v4.040.

--code retiré car très peu de modifications par rapport àcelui de 20H14.

--seul l'encodage et le desencodage par json de la liste sauvegardée en variable globale diffère.
Modifié par trainkill666
  • Upvote 1
Posté(e)

@trainkiller et @Gazous super boulot

 

Avec ses 2 scripts j'ai 2 exemple pour essayer de comprendre fonction return et les tables

pour le moment j'arrive avec une table simple

Posté(e)

Désolé si ça pollue un peu le sujet mais j'ai pensé à  une approche un peu plus générique pour les exclusion.

En effet, elle offre la possibilité au choix de saisir soit l'id d'un module à  exclure, soit un mot clé contenu dans le nom du module.

Cela offre un peu plus de souplesse.

Dans mon cas, j'ai un certains nombres de FGS dont les nom sont "Volet Salon", "Volet SAM" etc...

Il me suffit simplement de saisir le mot "Volet" dans la liste d'exclusion et le tour est joué.

 

Voici le code

 

Bouton

-- Récupération de la liste des modules
local HC2 = Net.FHttp("127.0.0.1", 11111)
local reponse = HC2:GET("/api/devices")
local 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
local toExclude = {72, "Caisson", "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

Mainloop

-----------------------------------------------------------
-- 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
local IconeAllume = 1030
local IconeEteint = 1031

-- Intervalle de mise à  jour automatique (en secondes)
local IntervalleMAJ = 10

-- 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
local toExclude = {72, "Caisson", "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
 
while true do
  
-- Variable du compteur
local compteurLumieres = 0
 
-- Récupération de la liste des modules
local HC2 = Net.FHttp("127.0.0.1", 11111)
local reponse = HC2:GET("/api/devices")
local json = json.decode(reponse)
 
-- 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
			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)
else
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint)
end
 
-- Attente de la prochaine mise à  jour automatique
fibaro:sleep(IntervalleMAJ*1000)
 
end 

Voilà , espérant que ça puisse servir à  d'autres.

Posté(e)

 @ Gazous

fibaro:getName(module.id)

peut être remplacé par

module.name

;)

 

Je pense que tu ne pollues pas le sujet, je n'ai jamais appris aussi vite en programmation que sur ce forum grâce aux échanges.

Posté(e)

Ce petit truc commence àprendre une tournure plus complète, je pense que je vais plutôt voir pour faire un plug-in complet et plein d'options.

Posté(e) (modifié)

Voici le code pensé différemment, au lieu de rechercher de nouveau les ID dans le code du bouton, on récupère la liste créée par le main loop contenant les ID (sans les modules exclus).

 

Toujours le même problème, code fait sans possibilité de Test car Box non opérationnelle grâce à  la 4.040 ;) , il peut donc y avoir des "coquilles" empêchant la bonne exécution du code. A vous de tester. :60:

 

Bouton :

--récupération des ID
	--fonction de décodage des variables globales
		local decodage = function (listeorigine)
  			local liste = json.decode((fibaro:getGlobal(listeorigine)))
  			return liste
  		end

--arrêt éclairage
local verifeclairage = function(liste)
		for index,valeur in ipairs(liste) do
                    if tonumber(fibaro:getValue(valeur, "value")) > 0 then
                        fibaro:call(valeur, "turnOff")
                    end
		end	
end
-----------------------------------------------------------------------------	

--récupération des IDS des modules à  éteindre		
local listeclairage = decodage("listeclairage")

--éteint les modules
verifeclairage(listeclairage)

Main Loop :

-- Identiants des icônes
local IconeAllume, IconeEteint = 1030, 1031
 
-- Intervalle de mise à  jour automatique (en secondes)
local IntervalleMAJ = 10

--liste d'exclusion contenant ID ou nom
local exclusion = {72, "Caisson", "Volet", "Bubendorff", "Tests"}

--test si le module est dans la liste d'exclusion
function controlexclusion(idmodule)
local retour = true
    for index, valeur in pairs(exclusion) do
        if idmodule.name:find(valeur) ~= nil or idmodule.id == valeur then retour = false break end --compare si le nom correspond ou l'id
    end
    return retour
end

-- Boucle sur les modules
local recherche = function (liste)
-- Liste à  sauvegarder pour les id des modules
local listeobtenue = {}
for k, v in ipairs(liste) do
    if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" and controlexclusion(v) then
        if v.properties.value == "true" then
            table.insert(listeobtenue, v.id)
        elseif v.properties.value ~= nil and v.properties.value ~="false" then
            if tonumber(v.properties.value) > 0 then
                  table.insert(listeobtenue, v.id)
            end
        end
    end
end
    return listeobtenue
end

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

--Sauvegarde pour les id des modules dans une variable globale
fibaro:setGlobal("listeclairage",json.encode(listeclairage))
 
-- Mise à  jour de l'icône
if #listeclairage > 0 then
    fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeAllume)
else
    fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint)
end
 
-- Attente de la prochaine mise à  jour automatique
fibaro:sleep(IntervalleMAJ*1000)
 
end
Modifié par trainkill666
Posté(e)

Incroyable j'ai fait des améliorations similaires de mon côté sans consulter ton message :)

J'ai du coup update mon post au dessus.

Concernant la liste à  stocker en variable globalle, très bonne idée mais ça implique la création d'une variable globale.

Est-ce que quelqu'un connaît la taille maximale en nombre de caractères pour une variable globale au fait ?

 

Par contre je vois une petit coquille ligne 46 : listeclairage à  remplacer par listeobtenue

Sinon je ne suis pas sà»r que json.encode fonctionne tel que tu l'as mis, il faudra passer par une fonction. Ne me demandes pas pourquoi, je se sais pas, mais j'ai déjà  eu ce problème...

Posté(e) (modifié)

@ Gazous,

ils manque plusieurs lignes que j'ai oublié lors du copié collé, merci ;) , je corrige. J'ai fait ça à  la va vite entre les travaux. :P

 

Et oui, j'ai oublié de préciser qu'il faut créer la variable globale "listeclairage".

 

Pour json.encode, je l'utilise depuis quelques jours pour créer automatiquement une recherche de tous les IDs de mon système. Ensuite tout est sauvegardé sur la variable, et ma scène (un système similaire à  GEA mais propre à  mon utilisation donc beaucoup moins complet) les charge à  son démarrage, et tout fonctionne. (Du moins pour le moment, et hormis les bug de la V4.040) Je prends donc des "morceaux" de ce que j'utilise dans les scènes, ce qui explique les risques d'erreurs, ou les oublies lors du copié-collé. ^_^

Modifié par trainkill666
Posté(e)

je confirme que ça fonctionne très bien la sauvegarde de ID en Json dans une variable global j'utilise cela depuis pas mal de temps aucun soucis. Pour la limite de peux pas dire mais j'avais vu sur un poste que l'on peut y aller sans soucis

il me semble que j'avais vu plus de 800 caractère c' était toujours OK

@Gazous par contre si tu connais la commande lua pour crée une variable globale sans avoir a passer par l'interface je suis preneur, Enfin si on peut 

Posté(e)

@mrpinfo : on ne peut pas je crois

et pour les caracteres dans une VG, steven a teste avec 42 000 environ, ca a fonctionne mais a mis 2h30 pour écrire dans la variable

 

Lsiteeclaireage ou listeobtenue alors ?

×
×
  • Créer...