Aller au contenu

trainkill666

Membres confirmés
  • Compteur de contenus

    273
  • Inscription

  • Dernière visite

  • Jours gagnés

    1

Messages posté(e)s par trainkill666

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

  3. @megabubu :

     

    Tu as essayé celui que je viens de poster ?

     

    En modifiant le code de neliger précédemment je n'avais pas fait attention,

    on a tous commis la même erreur (Gazous également).

    J'y ai pensé en recommençant tout à  partir de zéro.

    Il s'agit d'un Main Loop, il tourne déjà  en boucle, donc le

    while true do
    
    end
    

    et totalement inutile.

    Seul le

    fibaro:sleep()
    

    suffit.

    Peut-être est-ce la cause du plantage de son programme.

    Ou le chargement toutes les 10 secondes de la liste des modules par l'api.

    J'avais un problème identique dans un module virtuel de vérification des noeuds mort toutes les 30 secondes.

     

     

    PS : commentaire inutile donc barré sur le while true do, Gazous en a parlé quelques posts avant. Il faut que je pense à  lire les posts précedents ;)  .

    • Upvote 1
  4. J'ai refait tout le code à  ma façon cet après-midi (après une interminable petite sieste), 100% fonctionnel, par contre je n'ai pas eu le temps de mettre les commentaires sur le code.

     

    Ma façon de raisonner (suis gaucher donc un peu bizarre :P ) :

     

    ->Plutôt que d'essayer de lister l'éclairage avec islight, puis de supprimer ce qui ne doit pas l'être, autant mettre seulement les noms exactes des éclairages (j'ai énormément de FGS221 qui ne servent pas à  l'éclairage), c'est beaucoup plus simple (sauf pour ceux qui ont un château ;) ).

     

    -> J'ai séparé le listage de mise à  jour des modules du reste. On ne change pas de modules d'éclairage tous les jours, donc inutiles de charger la mémoires pour rien. Il suffira de cliquer sur "mise à  jour" après actualisation du listage des modules par nom pour la V1 ou choix du mot clé pour la V2. De plus comme c'est nous qui complétons la liste, elle ne change pas entre-temps.

     

    V1 du bouton "Mise à  jour": liste complétée manuellement.

    ou

    V2 :du bouton "Mise à  jour : recherche automatique par mot clé des modules.

     

     

     

    IL faut créer un module virtuel nommé "Eclairage général" (c'est un exemple :) ) avec :

    -> 1 bouton nommé "Arrêt" (ne pas oublié d'y mettre l'icône représentant l'éclairage éteint).

    -> 1 bouton nommé "Mise à  jour" (également avec un joli icône pour éviter 10 secondes de carré bleu le temps de la mise à  jour de celui-ci).

     

    Voici le code (je ne sais pas ajouter directement le module  -_- , si il y a un volontaire pour m'expliquer) :

     

    "Arrêt"

    --fonction 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 = json.decode((fibaro:getGlobal("listeclairage")))
    --éteint les modules
    verifeclairage(listeclairage)
    

    "Mise à  jour" V1 avec la liste des modules complétée manuellement :

    local HC2 = Net.FHttp("127.0.0.1", 11111)
    local reponse = HC2:GET("/api/devices")
    local resultat = json.decode(reponse)
    --fonction recherche modules
    local recherche = function (correspondance)
    local listeobtenue = {}
        for index, valeur in ipairs(resultat) do
            if correspondance[valeur.name] ~= nil then table.insert(listeobtenue, valeur.id) end
        end
        return listeobtenue
    end
    ----------------------------------------------------------------------------
    --liste des modules d'éclairage
    local listemodules = {
    ["Eclairage Bureau"] = 1,
    ["Eclairage Chambre"] = 2,
    ["Eclairage Couloir"] = 3,
    ["Eclairage Cuisine"] = 4,
    ["Eclairage Hall"] = 5,
    ["Eclairage Salon"] = 6,
    ["Eclairage SdB"] = 7
    }
    --création de la liste
    fibaro:setGlobal("testeclairage",json.encode(recherche(listemodules)))
    

    ou

    "Mise à  jour" V2 avec listage automatique par mot clé :

    local HC2 = Net.FHttp("127.0.0.1", 11111)
    local reponse = HC2:GET("/api/devices")
    local resultat = json.decode(reponse)
    --fonction recherche modules
    local recherche = function (correspondance)
    local listeobtenue = {}
        for index, valeur in ipairs(resultat) do
            if (valeur.name):find(correspondance) and valeur.type ~= "virtual_device" then table.insert(listeobtenue, valeur.id) end
        end
        return listeobtenue
    end
    ----------------------------------------------------------------------------
    --création de la liste
    fibaro:setGlobal("testeclairage",json.encode(recherche("Eclairage")))
    

    Main Loop :

    -----------------------------------------------------------------------------
    --Trainkill666
    -----------------------------------------------------------------------------
    -- Identiants des icônes
    local iconearret, iconemarche = 1020, 1019
     -- Intervalle de mise à  jour automatique (en secondes)
    local IntervalleMAJ = 10
    -----------------------------------------------------------------------------
    --création de la liste des éclairages
    local listeclairage = json.decode((fibaro:getGlobal("listeclairage")))
    --vérification des états
    local listeactif = 1
    for index,valeur in ipairs(listeclairage) do
        if tonumber(fibaro:getValue(valeur, "value")) > 0 then listeactif = 2 end
    end    
    -- Mise à  jour de l'icône
    local choixicone = {iconearret, iconemarche }
    fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", choixicone[listeactif])
    -- Attente de la prochaine mise à  jour automatique
    fibaro:sleep(IntervalleMAJ*1000)
    
  5. @pepite

     

    Soit tu fais une recherche par nom grâce à  if valeur.name == "ton nom de module" (test que j'effectue pour palier le islight qui ne fonctionne pas à  cause de la V4.040). J'en avais parlé au début du tuto.

     

    Soit avec if valeur.type ==  "com.fibaro.FGWP101"

     

    Ces conditions de test sont également à  rajouter dans le code, si ça t' intéresses je peux le faire.

     

    J'ai testé le code en shintant le islight et ça semble fonctionner (il y avait un tite erreur). ;)

  6. @ pepite

     

    J'ai hésité avant de mettre ce code, mais, je l'ai détaillé et simplifié au maximum.

     

    -> Il comporte le lancement d'une function comportant au moins 1 variable.

    -> La déclaration de table avec {} , l'ajout dans une table table.insert.

    -> Le renvoi du résultat de la fonction directement avec return et local mobiles = recherche(

    -> L'écriture de texte et de variables dans une même ligne pour un fibaro:debug.

    -> un if.

    -> une boucle for peut-être moins évidente à  comprendre pour les débutants : index représentant l'incrémentation dans la table, où 1 et le premier tour, jusqu'à  n représentant le dernier (soit la taille de la table qui peut être trouver par #listeobtenue). Valeur correspondant au résultat de table[index] .

    -> lecture et écriture de variable globale avec fibaro:setGlobal( et fibaro:getGlobal( .

    Après il y a la partie json que j’ai découvert la semaine dernière, mais autant se lancer dès le départ avec, on fera de belles économies de lignes de codes. Pour le détail, je peux le faire, mais j’avoue ne pas encore maîtriser totalement cette partie.

    Cependant valeur.type fibaro:getType(deviceID)  , valeur.id , valeur.name (fibaro:getName(deviceID)) , json.decode( , json.encode( c’est compréhensible.

     

    Voici un petit lien intéressant http://domotique-home.fr/docs-fibaro-francais-index-des-fonctions-thematique/.

    Je pense que dans tout ça, il y a les bases du Lua, sans être trop compliqué. Et on a obtenu les ID des portables pour la suite du programme. ;)

  7. Concernant l' "autostart" dans l'entête :

    Imaginons une coupure de courant, même courte, la box redémarre (tout le monde n'est pas sur onduleur).

    Durant ce laps de temps, il y a un changement d'état d'un ou des capteurs.

    Sans l' "autostart", le programme n'actualisera pas les messages tant que tous les capteurs ayant changés d'état ne seront pas de nouveaux actionnés.

    Autres solution, faire tourner en boucle le programme et ne pas utiliser les triggers

    while true do
    --programme
    fibaro:sleep(delai)
    end
    

    Personnellement, je préfère l' "autostart" qui doit moins consommer en ressource (mais làc'est àvérifier :P ).

  8. Voici une solution que j'ai écrite et donnée précédemment dans différents sujets sur le forum (mprinfo reconnaîtra probablement ce morceau de code, merci neliger pour les 3 premières lignes :60: ).

     

    Il recherche les modules par type en utilisant le json. Dans ce cas, ce programme récupère les IDs des mobiles (smartphone ou tablette).

     

    Une liste est crée sous forme de variable globale et peut donc être utilisé par toutes les autres scènes.

     

    Fonctionne en V4.

    --RECHERCHE PAR API
    --"Trainkill666" v1
    -----------------------------------------------------------------------------
    --à  placer dans un bouton de module virtuel
    -----------------------------------------------------------------------------
    --Déclaration pour l'api
    local HC2 = Net.FHttp("127.0.0.1", 11111)
    local reponse = HC2:GET("/api/devices")
    local listemodule = json.decode(reponse) --création de la table 1 listant tous les modules
    ----------------------------------------------------------------------------
     --fonction recherche
    local recherche = function (texte, typemodule)
    local listeobtenue = {} --table 2 provisoire
        for index,valeur in ipairs(listemodule) do --lecteur de la table 1
            if valeur.type == typemodule then --si le type lu dans la table 1 est identique au type recherché
                table.insert(listeobtenue, valeur.id) --ajout de l'ID du module dans la table 2
                fibaro:debug(texte .. " " .. #listeobtenue  .. " (ID = " .. valeur.id .. ") ".." = "..valeur.name)
            end
        end
        return listeobtenue --renvoi le résultat de la table 2
    end
    -----------------------------------------------------------------------------
     --démarrage
    local mobiles = recherche("Téléphone", "iOS_device") --lancement de la recherche de téléphone ou tablette (Attention respecter la CASSE)
    fibaro:setGlobal("mobiles",json.encode(mobiles)) --sauvegarde dans une variable globale sous forme de liste
    
    
    
    
    -----------------------------------------------------------------------------
    --à  ajouter au début la scène pour charger la liste des mobiles
    -----------------------------------------------------------------------------
    --récupération des ID
        --fonction de décodage des variables globales
            local decodage = function (listeorigine)
                  local liste = json.decode((fibaro:getGlobal(listeorigine))) --lecteur de la variable globale
                  return liste --renvoi le résultat
              end
    
    --création de la liste des mobiles
    local listeIDmobiles = decodage("mobiles")
    

    Il peut également servir pour rechercher les capteurs, volets...

     

    J'ai laissé le code complet pour qu'il soit le plus générique possible, afin de faire par exemple plusieurs créations de listes, ainsi que la lecture de celles-ci. (d'où les fonctions qui peuvent paraître inutiles pour une seule liste).

     

    Si il y a un programme identique sur le forum, merci de m'en informer afin que je retire celui-ci, et que j'y place le lien de l'autre à  la place.

    • Upvote 1
  9. @ 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é. ^_^

  10. 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
    
  11. @ 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.
    
    • Upvote 1
  12. 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.

  13. A tester, je ne peux pas car suite à  la maj 4.040 la box plante, ce code est fait à  "l'aveugle", il doit donc y avoir des "coquilles". :P

     

    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)
     
    -- Boucle sur les modules
    for k, v in ipairs(json) do
    	if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" 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
    

    Main Loop

    -- Identiants des icônes
    local IconeAllume = 107
    local IconeEteint = 108
     
    -- Intervalle de mise à  jour automatique (en secondes)
    local IntervalleMAJ = 10
     
    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" 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
    
    • Upvote 3
×
×
  • Créer...