Aller au contenu

Messages recommandés

Posté(e)

Attention a l utilisation des vg cela et de plus en plus lent depuis la v4 donc la création d'une table en début de scripts via l'api ne doit guère être plus lourde en charge processeur qu un appel multiple a des vg et c'est bien plus simple comme solution

Envoyé de mon SM-G900F

Posté(e)

Ok, je ne le savais pas.

 

Mais pour compléter ta solution, on peut rajouter le contrôle que j'ai mis plus haut pour ne générer/mettre à  jour la table qu'à  la demande.

 

 

Donc un bouton qui incrémente  l'état d'une VG "mise_a_jour_table" 

 

et en début de script de génération : 

si mise_a_jour_table > locale_generation

 alors  

    script de génération

    locale_generation = mise_a_jour_table

Fin de si

Posté(e)


-- Mise àjour àla demande par incrémentation d'une variable globale (bouton de module virtuel)

if mise_a_jour_table > local generation_a_faire then

local generation = mise_a_jour_table

local dead = true -- true pour exporter les devices morts

local excludeType = {"weather", "HC_user", "iOS_device"}

local excludeID = {}

-- Initiate connection with HC2

HC2 = Net.FHttp("127.0.0.1", 11111)

response ,status, errorCode = HC2:GET("/api/devices")

devicesJSon = json.decode(response)

local devices = {}

local names = {}

local rooms = {}

function addName(name, roomname)

if (type(names[name]) == "nil") then

names[name] = true

return name

else

return addName(name.."_"..roomname, roomname)

end

end

function getRooms()

response ,status, errorCode = HC2:GET("/api/rooms")

roomsJSon = json.decode(response)

rooms[0] = "inconnu"

for k, v in ipairs(roomsJSon) do

rooms[v.id] = v.name

end

end

function rename(name, roomname)

local name = name:upper():gsub("[éêèë]", "E"):gsub("EE", "E"):gsub("[ûüù]", "U"):gsub("UU", "U"):gsub("[àâä]", "A"):gsub("AA", "A"):gsub("[öô]", "O"):gsub("OO", "O"):gsub("[îï]", "I"):gsub("II", "I"):gsub("%W", "_")

local roomname = roomname:upper():gsub("[éêèë]", "E"):gsub("EE", "E"):gsub("[ûüù]", "U"):gsub("UU", "U"):gsub("[àâä]", "A"):gsub("AA", "A"):gsub("[öô]", "O"):gsub("OO", "O"):gsub("[îï]", "I"):gsub("II", "I"):gsub("%W", "_")

return addName(name, roomname)

end

getRooms()

for k, v in pairs(devicesJSon) do

local doit = (dead or not v.dead)

if (doit) then

for h, w in pairs(excludeType) do

if (v.type == w) then

doit = false

end

end

if (doit) then

for h, w in pairs(excludeID) do

if (v.id == w) then

doit = false

end

end

end

end

if (doit) then

table.insert(devices, v)

end

end

table.sort(devices, function(a,B) return a.roomID<b.roomID end)

local result = "<BR><BR>-- IDs générés le : " .. os.date("%d/%m/%y à%X")

local room = -1

local lastinfo = "";

result = result .. "<BR><BR>local id = {"

for k, v in ipairs(devices) do

if (room ~= v.roomID) then

room = v.roomID

result = result .. "<BR>--"..rooms[v.roomID].."<BR>"

end

lastinfo = rename(v.name, rooms[v.roomID])

result = result .. lastinfo .. " = " .. v.id .. ", "

end

result = result .. "<BR>}"

result = result .. "<BR>"

result = result .. "<BR>-- usage :"

result = result .. "<BR>-- fibaro:getValue(id[\""..lastinfo .."\"], \"value\")"

result = result .. "<BR>-- GEA.add(id[\""..lastinfo .."\"], 30, \"\")"

-- print(result)

fibaro:debug(result)

Posté(e)

personnellement je mettrai le code en début de chaque scène voir pour réduire la table faire plusieurs table

par exemple une pour les fgrm etc... en fonction de ce que la scène a besoin

après il n'y a plus qu'a adapter le code que je t'ai donné pour qu'il utilise la bonne table

Posté(e)

tu fais cela dans un VD moi je l’aurai fais dans une scène avec par exemple autostart pour que cela soit mis a jour lors du démarrage et comme on peut exécuté un scéne je ne vois pas l'utilité d'utiliser un VD

Posté(e)

L'idée c'était de ne générer que lorsqu'on réinclus des modules, donc juste un petit bouton qui dit à  tous les scripts de remettre à  jour leurs table.

 

Mais j'ai peut être pas tout saisie ? je débute sur Fibaro.

Posté(e)

non tu as bien saisi tu es chez apple lol

 

les appels a l'api sont plus facile dans une scéne

 

l'avantage de la scène c'est les triggers par exemple tu peux grace a %%autostart mettre a jour la table lors du démarrage de la box

 

si tu veux seulement que la scène ce lance manuellement tu ne mets rien dans l'entête

et lorsque tu as besoin tu cliques sur exécuté cela reviens au même que le VD

 

Je n'utilise les VD que pour afficher des valeurs ou les changer ou faire une télécommande qui me permet de modifier des valeurs

pour le reste j'utilise les scènes

Posté(e)

Effectivement il serait plus judicieux de lancer la scène de génération manuellement.

Donc si je comprends bien, on met la variable %%autostart

Et alors on peut n'exécuter le script de génération que si cette variable = True ?

 

Pour concrétiser :

on déclare la variable %%autostart

 on mets le script de génération dans chaque scène

 on contrôle celui-ci par un if autostart alors generation

 puis  script de la scène

 

Donc normalement, si je redémarre la Box, autostart = true

Alors toutes les scènes qui on la variable autostart vont s'exécuter (l'alarme va se déclencher, les volets vont s'ouvrir, le grille pain va repeindre le plafond...)

 

Bon en fait j'ai pas vraiment saisi la structure générale

HELP

 

P.S. je ne me suis pas encore tapé la doc du LUA Fibaro, je code au feeling ;-)

Posté(e)

%%autostart dans l'entête sert a lancer la scène au démarrage

--[[
%% autostart
--]]

si tu veux lancer un scène avec une vg ou avec un changement de proprieté d'un module

--[[
%% properties
11 value
31 sceneActivation
169 sceneActivation
%% globals
SoleilLever
SoleilCoucher
Heure
--]]

si tu veux lancer la scéne manuelllement

--[[
--]]

--ou tu ne mets rien

pour savoir comment la scène est lancer et récuperer le nom du déclencheur ainsi que ça valeur

local trigger = fibaro:getSourceTrigger()
if (trigger['type'] == 'global') then
  nomTrigger = trigger['name']
  valeurTrigger = tonumber(fibaro:getGlobalValue(nomTrigger))
  print("Nom du déclencheur = ", nomTrigger, " - Minutes : ", valeurTrigger)
elseif (trigger['type'] == 'property') then
  nomTrigger = tonumber(trigger['deviceID'])
  fibaro:debug("trigger id = "..nomTrigger)
  valeurTrigger = tonumber(fibaro:getValue(nomTrigger, "sceneActivation"))
  print("ID du Module déclencheur = ", nomTrigger, " - Valeurs : ", valeurTrigger)
else
  fibaro:debug("La scéne ne peut être lancer que par une Variable Globale")
  fibaro:abort();
end

je suis comme toi je débute

  • 1 mois après...
Posté(e)

Me revoilou ;-)

 

bon pour le moment j'ai joué la carte de la simplicité :

création d'une table de mes modules dans le panneau de variables globales

ex. : 

nom raccourci du module / n° ID

VB1 valeur 51

VS1 valeur 111

VS2 valeur 8

 

ainsi dans mes scripts, je fais juste une récupération de la VG dans une VLocale

local VS1 = fibaro:getGlobalValue("VS1")

 

Ensuite les scripts non plus jamais à  être modifiés :

 

Action sur les volets

fibaro:call(VS1, "close")

fibaro:call(VS2, "close")

fibaro:call(VS3, "setValue", « 50 »)

 

En cas de réinclusion d’un module, il me suffit de mettre à  jour le nouvel ID dans la table des VG

 

Pour le moment, pas constaté de ralentissement.

Posté(e)

Regarde steven a fait ub truc très bien pour les id. Tu peux aussi récupérer l'id via le nom que tu donnes aux modules

Envoyé de mon SM-G900F

Posté(e)

Dans la rubrique Tutos ?

Sinon comment générer les données de template pour un module chinois et l'envoyer àFibaro.

Merci

Envoyé de mon iPhone en utilisant Tapatalk

×
×
  • Créer...