-
Compteur de contenus
4 434 -
Inscription
-
Dernière visite
-
Jours gagnés
201
Tout ce qui a été posté par Steven
-
Je n'utilise plus ma Zibase pour l'instant, mais pourrais-tu faire un test. Changer une variable de la Zibase selon l'état de la porte du garage et voir si le fichier sensors.xml prend en compte cette variable dans la section : <vars> <var num="0" val="0"/> <var num="1" val="0"/> <var num="2" val="0"/> <var num="3" val="0"/> <var num="4" val="0"/> <var num="5" val="0"/> <var num="6" val="0"/> <var num="7" val="0"/> <var num="8" val="0"/> <var num="9" val="0"/> <var num="10" val="0"/> <var num="11" val="0"/> <var num="12" val="0"/> <var num="13" val="0"/> <var num="14" val="0"/> <var num="15" val="2"/> <var num="16" val="0"/> <var num="17" val="1"/> <var num="18" val="-1"/> <var num="19" val="-1"/> <var num="20" val="243"/> <var num="21" val="174"/> <var num="22" val="0"/> <var num="23" val="0"/> <var num="24" val="190"/> <var num="25" val="0"/> <var num="26" val="-1"/> <var num="27" val="-1"/> <var num="28" val="-1"/> <var num="29" val="500"/> <var num="30" val="1"/> <var num="31" val="-32762"/> </vars> Si cela fonctionne, on pourra ce baser là dessus.
-
@minos J'ai tout réinstallé le VD et j'ai bien la remontée de mon CSXXXXXXX_V1 Voici le code que j'ai dans mon VD derrière le bouton Rafraichir. -- This script will request sensors.xml file from a Zibase -- and use it to change global variables. -- Version = "1.0.0" -- Author = "Domotique-Info.fr (Steven Piccand)" -- Info = "Memory is preserved: Object are only load once in memory"-- This program is free software: you can redistribute it and/or modify -- This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. -- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -- You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. local maj = 30 -- Durée en secondes de la mise à jour -- -------------------------------------------------------------------------------------------------------------- -- Check that one and only one instance is in memory -- -------------------------------------------------------------------------------------------------------------- if ((not Zibase) or (Zibase.errors >= 5)) then Zibase = { errors = 0 } -- -------------------------------------------------------------------------------------------------------------- -- Miscellaneous -- -------------------------------------------------------------------------------------------------------------- Zibase.url = fibaro:get(fibaro:getSelfId(), 'IPAddress') Zibase.port = fibaro:get(fibaro:getSelfId(), 'TCPPort') -- -------------------------------------------------------------------------------------------------------------- -- Get the XML from the zibase and return it as a LUA table -- -------------------------------------------------------------------------------------------------------------- Zibase.getXml = function() --local zibaseURL = Net.FHttp("zibase.net"); --response, status, errorCode = zibaseURL:GET("/m/get_xml_sensors.php?device="..Zibase.id.."&token="..Zibase.token); local zibaseURL = Net.FHttp(Zibase.url) response, status, errorCode = zibaseURL:GET("/sensors.xml") return Zibase.iif(response ~= nil, Zibase.newParser().ParseXmlText(response), "") end -- -------------------------------------------------------------------------------------------------------------- -- Put all Sensors values in global variables -- -------------------------------------------------------------------------------------------------------------- Zibase.putSensorsInMemory = function(id) local index = 1 local xmlTable = Zibase.getXml() if (xmlTable) then if (not xmlTable.doc) then Zibase.errors = Zibase.errors+1 return nil end local evs = xmlTable.doc.evs for i in pairs(evs:children()) do local idtmp = evs.ev[i]["@id"] if (evs.ev[i]["@pro"]) then idtmp = evs.ev[i]["@pro"] .. idtmp else if (evs.ev[i]["@type"] == "2") then idtmp = "VS" .. idtmp elseif (evs.ev[i]["@type"] == "6") then idtmp = "CS" .. idtmp elseif (evs.ev[i]["@type"] == "7") then idtmp = "OS" .. idtmp elseif (evs.ev[i]["@type"] == "8") then idtmp = "VR" .. idtmp elseif (evs.ev[i]["@type"] == "10") then idtmp = "WS" .. idtmp end end if (not id) then fibaro:setGlobal(idtmp.."_V1", evs.ev[i]["@v1"]) fibaro:setGlobal(idtmp.."_V2", evs.ev[i]["@v2"]) fibaro:debug(idtmp) elseif ((id ~= nil) and (idtmp == id)) then values = {} values[1] = evs.ev[i]["@v1"] values[2] = evs.ev[i]["@v2"] return values end end end return nil end -- -------------------------------------------------------------------------------------------------------------- -- Get the values (v1 and v2) of a sensor from the zibase -- -------------------------------------------------------------------------------------------------------------- Zibase.getSensorValues = function(id) if (id ~= nil) then return Zibase.putSensorsInMemory(id) else return nil end end -- -------------------------------------------------------------------------------------------------------------- -- Get the value from a variable from the zibase -- -------------------------------------------------------------------------------------------------------------- Zibase.getVariable = function(num) local xmlTable = Zibase.getXml() if (xmlTable) then if (not xmlTable.doc) then Zibase.errors = Zibase.errors+1 return "" end local vars = xmlTable.doc.vars for i in pairs(vars:children()) do if (vars.var[i]["@num"] == num) then return vars.var[i]["@val"] end end end return "" end -- ------------------------------------------------------------------------------------------------------------- -- Test the condition and return true or false param depending of the result -- param : condition (condition to test) -- iftrue (result to return of condition if true) -- iftfalse (result to return of condition if false) -- ------------------------------------------------------------------------------------------------------------- Zibase.iif = function(condition, iftrue, iffalse) if (condition) then return iftrue end return iffalse end -- ------------------------------------------------------------------------------------------------------------- -- Return a random number from 1 to 100 -- ------------------------------------------------------------------------------------------------------------- Zibase.random = function() return math.random(100) end -- ------------------------------------------------------------------------------------------------------------- -- This is a modified version of Corona-XML-Module by Jonathan Beebe which in turn -- is based on Alexander Makeev's Lua-only XML parser . -- see https://github.com/Cluain/Lua-Simple-XML-Parser -- ------------------------------------------------------------------------------------------------------------- Zibase.newParser = function() parseXml = {} parseXml.FromXmlString = function(value) value = string.gsub(value, "&#x([%x]+)%;", function(h) return string.char(tonumber(h, 16)) end); value = string.gsub(value, "&#([0-9]+)%;", function(h) return string.char(tonumber(h, 10)) end); value = string.gsub(value, "\"", "\""); value = string.gsub(value, "'", "'"); value = string.gsub(value, ">", ">"); value = string.gsub(value, "<", "<"); value = string.gsub(value, "&", "&"); return value; end parseXml.ParseArgs = function(node, s) string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a) node:addProperty(w, parseXml.FromXmlString(a)) end) end parseXml.ParseXmlText = function(xmlText) local stack = {} local top = parseXml.newNode() table.insert(stack, top) local ni, c, label, xarg, empty local i, j = 1, 1 while true do ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i) if not ni then break end local text = string.sub(xmlText, i, ni - 1); if not string.find(text, "^%s*$") then local lVal = (top:value() or "") .. parseXml.FromXmlString(text) stack[#stack]:setValue(lVal) end if empty == "/" then -- empty element tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) top:addChild(lNode) elseif c == "" then -- start tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) table.insert(stack, lNode) top = lNode else -- end tag local toclose = table.remove(stack) -- remove top top = stack[#stack] if #stack < 1 then error("XmlParser: nothing to close with " .. label) end if toclose:name() ~= label then error("XmlParser: trying to close " .. toclose.name .. " with " .. label) end top:addChild(toclose) end i = j + 1 end local text = string.sub(xmlText, i); if #stack > 1 then error("XmlParser: unclosed " .. stack[#stack]:name()) end return top end parseXml.newNode = function(name) local node = {} node.___value = nil node.___name = name node.___children = {} node.___props = {} function node:value() return self.___value end function node:setValue(val) self.___value = val end function node:name() return self.___name end function node:setName(name) self.___name = name end function node:children() return self.___children end function node:numChildren() return #self.___children end function node:addChild(child) if self[child:name()] ~= nil then if type(self[child:name()].name) == "function" then local tempTable = {} table.insert(tempTable, self[child:name()]) self[child:name()] = tempTable end table.insert(self[child:name()], child) else self[child:name()] = child end table.insert(self.___children, child) end function node:properties() return self.___props end function node:numProperties() return #self.___props end function node:addProperty(name, value) local lName = "@" .. name if self[lName] ~= nil then if type(self[lName]) == "string" then local tempTable = {} table.insert(tempTable, self[lName]) self[lName] = tempTable end table.insert(self[lName], value) else self[lName] = value end table.insert(self.___props, { name = name, value = self[name] }) end return node end return parseXml; end end -- ------------------------------------------------------------------------------------------------------------- -- Send a message in the default chat frame if debug mode is activated -- param : sMessage (message to display) -- return : <none> -- ------------------------------------------------------------------------------------------------------------- Zibase.putSensorsInMemory() local time = os.date("le %d.%m.%Y à %H:%M:%S") if (Zibase.errors > 0) then time = "Erreur : " .. Zibase.errors end fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label0.value",time)
-
Version 1.20.0 Adds support for heating zone schedules on Android Watch Adds heating zone edit in Fibaro The Heat Controller detailed view Other minor improvements and bug fixes P.S Très pratique le changement depuis la montre.
-
Domotiser porte garage sectionnelle
Steven a répondu à un(e) sujet de Zorro dans Actionneurs & Ouvrants (Portail, volets, piscines, ...)
Si tu as une alimentation proche de ton bouton pression. Tu peux simplement le remplacer par un z-wave. L'installation sera plus facile et tu n'auras par besoin de FGS. Je pense même que cela sera moins cher. https://www.domadoo.fr/fr/peripheriques/2060-tkb-home-tz66-s-interrupteur-simple-z-wave-blanc-6959174466508.html -
Domotiser porte garage sectionnelle
Steven a répondu à un(e) sujet de Zorro dans Actionneurs & Ouvrants (Portail, volets, piscines, ...)
J'avais écrit un article sur https://spiccand.wordpress.com/2014/03/26/domotiser-son-garage-un-cas-concret/ sur la domotisation de ma porte de garage. J'utilise le même détecteur d'ouverture/fermeture que @mprinfo. Regarde l'article, il y a tout ce que tu as besoin. P.S. Je vole l'idée du wall plug pour les longues vacances. -
Petite info (inutile ou pas ... voir directement pour la poubelle). Si les utilisateurs ont installé le plug-in Philips Hue dans leur HC2, il est aisé de retrouvé tout ce qu'il faut (hueGroupID, IP, hueUser) en partant uniquement d'une ampoule (ID dans la HC2) ou ID du pont. -- PSEUDO code -- local id = 230 -- ID d'une ampoule hue déclarée dans la HC2 ou du pont local device = api.get("/devices/"..id) local lightid = device.properties.lightId -- numéro du hueGroupID if (device.parentId > 0) then -- c'est une ampoule, on recherche donc le pont device = api.get("/devices/"..device.parentId) end -- retourne hueGroupId, l'adresse IP et le code User return lightid, device.properties.ip, device.properties.userName
-
@Phil1789 Sur le site domotique-info.fr tu trouveras un tuto avec le VD en question, créé dans les années 2000 Recherche "passerelle zibase". Je ne peux pas te donner de lien plus précis, ce site est interdit à mon boulot.
-
@minos Mon dieu, tu dois être le dernier sur la planète à utiliser ce VD Pourrais-tu me donner le contenu de ton fichier sensor.xml s'il te plait ? http://<adresse zibase>/sensor.xml Principalement la section suivante : <evs> <ev type="10" pro="WS" id="133703" gmt="1514985510" v1="21964" v2="4" lowbatt="1"/> <ev type="8" pro="VR" id="630027392" gmt="1519069530" v1="1" v2="0" lowbatt="0"/> ... <ev type="6" pro="CS" id="625060767" gmt="1514189766" v1="1" v2="0" lowbatt="0"/> ... <ev type="8" pro="VR" id="1331037448" gmt="1511916211" v1="1" v2="0" lowbatt="0"/> </evs>
-
Si comme moi vous n'avez que des Philips Hue blanc, il y a toujours ceci (mais sans la minuterie) :
-
En bref, tu veux savoir l'inverse de ce que tu as demandé 2 posts plus haut ?
-
Chez moi, je n'arrive pas reproduire les problèmes de redémarrage de GEA avec des "RestartTask" immediat. Est-ce que les personnes souffrante de ce symptôme pourraient m'envoyer leur configuration svp. steven.piccand@gmail.com Merci d'avance. P.S Noté moi aussi sur quel version de votre HC2 vous tournez, cela peut aider.
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
%% properties 73 ui.JourNuit.value Selon l'exemple de @pepite
- 12 330 réponses
-
- 1
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Donc le "40 Value" dans l'entête, tu l'enlèves de suite GEA.add({{"SceneActivation", 27, 24}, {"Value-", 40, 90}}, -1, "", {"Open", 40}) -- Value < 90 donc légèrement fermé GEA.add({{"SceneActivation", 27, 24}, {"Value+", 40, 10}}, -1, "", {"Close", 40}) -- Value > 10 donc légèrement ouvert
- 12 330 réponses
-
- 1
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Voilà ce que je lis : Quand il y a un double clique : - Si le volet est fermé, ouvre le .... puis - Si le volet n'est pas fermé, ferme le Si la 1ère ligne ouvre le volet, il est normal que celle d'après va le fermer vu que l'ouverture est en cours donc Value ne sera plus à 0. Pour moi, GEA fonctionne correctement dans ce cas de figure. C'est un problème de logique et il faut trouver une astuce. Après, je suis convaincu que tu as un %% properties 40 Value dans ton entête ?
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
-
C'est currentIcon à la place de deviceIcon fibaro:get(selfId, "currentIcon");
-
C'est exactement ce que j'avais fait. Courage
-
Tu as quasiment tout compris hormis un point important. Fenetre 3 boucle principale. (appelée "main loop") "Ce code tourne en permanence Il reprend au debut lorsqu'il a finiIl est donc conseillé de mettre un sleep pour que la machine puisse attribuer correctement ses ressources aux autres modules." La réponse est non, ce code ne tourne pas en permanence mais toutes les 3 secondes. Le sleep est donc à proscrire vu qu'il est déjà fait. Pour ceci : --[[ %% globals variableglobale1 %% properties ]]-- Ce genre de code n'est valable QUE dans les scénarios. Si tu met cela dans le "main loop" d'un module virtuel cela ne fera rien du tout. Cela répond à ta question "Mais ca sert a quoi puisque ce code tourne de toute façon en permanence (hors sleep)C'est incoherent .. J'ai du rater quelque chose !!" Pour les scénarios qui tournent en boucle ou l'un qui déclenche l'autre sans que cela semble cohérent. Le problème vient toujours de l'entête (le code mentionné ci-dessus). L'entête décrit les déclencheurs du scénario. Si je met dans l'entête d'un de mes scénarios ceci : --[[ %% globals %% properties 130 value ]]-- A chaque fois que le module (z-wave) 130 va changer de valeur, ce scénario sera exécuté (idem pour les variables globales). Dans l'entête ne doivent figurer QUE et UNIQUEMENT les événements qui vont déclencher le scénario. Exemple de scénario à problème --[[ %% globals %% properties 130 value ]]-- if (fibaro:getValue(130, "value") == "0") then fibaro:call(130, "turnOn") else fibaro:call(130, "turnOff") end En gros, chaque fois que le module 130 change de valeur je relance ce scénario et ce scénario allume ou éteint le module 130 selon son état ... et voilà une jolie boucle sans fin qui va faire clignoter ton module 130 comme un arbre de Noël. Voilà, j'espère avoir répondu à ta/tes questions.
-
1h30 ... c'est un Sleep Kangourou ?
-
Ah non, attention, je ne suggère rien du tout, c'était juste une mise en garde sur une constatation qu'on avait fait sur le "main loop".
-
Je comprends mieux le besoin. Non, en effet, GEA n'est pas du tout prévu pour ce genre de cas, il tourne toutes les X secondes et l'idée de le faire tourner plus rapidement lui ferais perdre tout son utilité. Pour une intégration avec GEA ou n'importe quel autre scénario, il suffirait que tu ais un label qui change d'état une fois la durée atteinte et on pourrait le récupérer dans l'entête de n'importe quel scénario (ou une variable globale) : %% propeties 100 ui.lblReady.value GEA.add({"Label", 100, "lblReady", "OK"}, -1, "Décompte terminé", ...)
-
On avait déjà remarqué qu'un "Sleep" supérieur à ~40mn dans le main loop fait explosé ce dernier. Il fallait mieux créer une variable global (non pas une VG fibaro) qui laisse s'exécuter le Main Loop et qui vérifie quand l'action doit être effectuée. Je ne sais pas si c'est toujours d'actualité car cela date de quelques versions mais pour palier à cela j'utilisais un code du style : local nbHeure = 12 function doIt() -- VOTRE CODE -- fibaro:log(os.date("%d %B %Y - %H:%M:%S")) fibaro:call(fibaro:getSelfId(), "setProperty", "logTemp", "TxtGray" ) end if (not instance) then instance = { lastrun = os.time(), every = nbHeure } end diff = os.date("*t", os.difftime(os.time(), instance.lastrun)) if (diff.hour >= instance.every) then doIt() instance.lastrun = os.time() end
-
Je me souvenais bien avoir lu ton message, mais il suffit de 3 jours de repos pour devoir retrouver 3 pages de posts :-) Je te propose l'inverse, soit le "value" à la fin dans le "getValue" et le "action". Ceci pour une raison bien précise et je te le démontre par un exemple : {"Transpose", {true, false}, {"ON", "OFF"}, {"TurnOn", id}} Dans les mécanisme actuel de GEA, je transforme, à la volée, la dernière valeur avant de traiter la ligne. Càd que GEA va d'abord traiter le {"TurnOn", id} puis traiter la ligne ainsi : {"Transpose", {true, false}, {"ON", "OFF"}, false} En revanche, si le {"TurnOn", id} ne se trouve pas à la fin, il ne sera pas traité en amont. De plus, cela correspond au standard GEA ou pour toutes les autres options la "value" (si elle existe) est à la fin. Est-ce que cela te va ?
- 12 330 réponses
-
- 1
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Question bête : Comment être précis à la seconde prêt avec un main loop qui tourne toutes les 3 secondes ? Avec un sleep(x) lors du dernier passage ? Autre question bête ... allez, soyons fou ... quel intérêt de ce genre de module pour de la domotique ? (Comme le disait @Berale24 lui-même c'est un gadget et il gérait des minutes ce que je peux comprendre mais des secondes ?) Perso, je n'arrive pas trouver de réponse mais il doit y avoir un usage auquel je ne pense pas et je serais curieux d'avoir des suggestions ... donc je m'abonne à ce topic non pas pour embêter comme à l'accoutumée mais par curiosité.
-
Pendant longtemps, je n'avais quasiment aucune notification Fibaro qui passait. Suite à d'autre soucis, Fibaro est passé sur ma box et on corrigé pas mal de petit truc. Depuis, plus aucun soucis de notification. Par contre, je ne sais pas ce qu'ils ont fait. Cela peux valoir la peine de soulever ton soucis au support de Fibaro ?