jjacques68 Posté(e) le 24 septembre 2017 Signaler Posté(e) le 24 septembre 2017 (modifié) Bonjour à tous ! Je suis confronté à problème complètement délirent. J'ai un bout de code qui veut pas fonctionner dans une scène alors qu'il fonctionne très bien dans une autre !!! voila le bout de code qui fonctionne très bien : (il met à jour le wakeUpTime d'un module) local device = api.get("/devices") for i,v in ipairs(device) do if device[i].id == 48 then local Value=api.get("/devices/"..device[i].id) Value.properties.wakeUpTime = 18000 api.put("/devices/"..device[i].id, Value) end end et voila celui qui ne fonctionne pas : (dans une autre scène, plus complexe, que j'ai simplifié pour le sujet...) local device = api.get("/devices") --liste tous les devices local typeDevice = { {type = "com.fibaro.remoteController", zwaveCompany = "ID-RF", up = 0, maxTime = 0}, {type = "com.fibaro.doorSensor", zwaveCompany = "Fibargroup", up = 1, maxTime = 64800}, --je raccourcie la liste... } --pour tous les device for i,v in ipairs(device) do -- filtre que les device à pile et visible if device[i].properties.wakeUpTime and device[i].visible == true then --pour tous les éléments de typeDevice for j,v in ipairs(typeDevice) do --si le type et zwaveCompany sont identiques if device[i].type == typeDevice[j].type and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then local Value=api.get("/devices/"..device[i].id) Value.wakeUpTime = typeDevice[j].maxTime api.put("/devices/"..device[i].id, Value) ------> BLOQUE ICI !!!! il me dit : [DEBUG] 11:08:41: [1;31m2017-09-24 11:08:41.463993 [ fatal] Runtime error: [string " return function(composite, ret, encode, sta..."]:4: attempt to call global 'type' (a string value) J'ai tout essayé et rien y fait... merci pour vos conseils !!!! Modifié le 24 septembre 2017 par jjacques68
BenjyNet Posté(e) le 24 septembre 2017 Signaler Posté(e) le 24 septembre 2017 Le problème c'est pas parce que tu utilises 2 fois la même variable v ???
jjacques68 Posté(e) le 24 septembre 2017 Auteur Signaler Posté(e) le 24 septembre 2017 Je viens d’essayer en remplaçant le 2ème v par W, mais ça change rien
pepite Posté(e) le 25 septembre 2017 Signaler Posté(e) le 25 septembre 2017 Le 24/09/2017 à 11:25, jjacques68 a dit : attempt to call global 'type' (a string value) Salut messieurs, Ca viendrait pas plutot du type non ? Ce qui explquerait pourquoi dans ton 1er exemple cela fonctionne ;-) avec un tostring non ?
jjacques68 Posté(e) le 25 septembre 2017 Auteur Signaler Posté(e) le 25 septembre 2017 Alors j’ai tout essayé !!! Tostring to number... et dans le premier exemple, c’est bien un chiffre que j’envoie et non une chaîne !!!
pepite Posté(e) le 25 septembre 2017 Signaler Posté(e) le 25 septembre 2017 (modifié) Y a pourtant bien un "type" qu'il n' pas l'air d'aimer vu le retour lua. je ne parle pas de la valeur que tu envoies, mais bien de device.type ou celui de typeDevice[j] Dans ton 1er exemple, tu ne testes pas par type Modifié le 25 septembre 2017 par pepite
jjacques68 Posté(e) le 25 septembre 2017 Auteur Signaler Posté(e) le 25 septembre 2017 Je viens de faire l’essai en ajoutant cette condition dans mon premier exemple, et veux toujours rien savoir... ça commence à m’enerver Se truc...
jjacques68 Posté(e) le 25 septembre 2017 Auteur Signaler Posté(e) le 25 septembre 2017 Voici exactement le code de ma première scène qui est quasi identique à ma seconde scene, alors la je pige plus... local device = api.get("/devices") local typeDevice = { {type = "com.fibaro.FGFS101", zwaveCompany = "Fibargroup", up = 1, maxTime = 20000}, } for i,v in ipairs(device) do if device[i].properties.wakeUpTime and device[i].visible == true then for j,v in ipairs(typeDevice) do if device[i].type == typeDevice[j].type and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then if device[i].properties.wakeUpTime ~= typeDevice[j].maxTime then if tonumber(typeDevice[j].up) == 1 then local Value=api.get("/devices/"..device[i].id) Value.properties.wakeUpTime = typeDevice[j].maxTime api.put("/devices/"..device[i].id, Value) print("ok") end end end end end end
pepite Posté(e) le 26 septembre 2017 Signaler Posté(e) le 26 septembre 2017 Alors la:-) Envoyé de mon Nexus 5X en utilisant Tapatalk
Steven Posté(e) le 26 septembre 2017 Signaler Posté(e) le 26 septembre 2017 1ère scène : Value.properties.wakeUpTime = 18000 2ème scène : Value.wakeUpTime = typeDevice[j].maxTime Cherché l'erreur :-) 2
pepite Posté(e) le 26 septembre 2017 Signaler Posté(e) le 26 septembre 2017 Ahah, j'ai relu lusieurs fois, je n'avais pas remarqué ;-) l'oeil de lynx master ;-)
Steven Posté(e) le 26 septembre 2017 Signaler Posté(e) le 26 septembre 2017 Pourtant ça sautait aux yeux non ? if device[i].properties.wakeUpTime and device[i].visible == true then --pour tous les éléments de typeDevice for j,v in ipairs(typeDevice) do --si le type et zwaveCompany sont identiques if device[i].type == typeDevice[j].type and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then local Value=api.get("/devices/"..device[i].id) Value.wakeUpTime = typeDevice[j].maxTime api.put("/devices/"..device[i].id, Value) ------> BLOQUE ICI !!!! 1
jjacques68 Posté(e) le 26 septembre 2017 Auteur Signaler Posté(e) le 26 septembre 2017 Il manque le .properties ?! je pense que ça viens du copier coller... je vérifie ce soir, mais quasi sur qu’il est présent dans le code qui fonctionne pas. si vous regarder le 3 eme code posté, qui est un clone de celui qui marche pas, vous verrez... et pourtant ce clone fonctionne...
jjacques68 Posté(e) le 26 septembre 2017 Auteur Signaler Posté(e) le 26 septembre 2017 Bon alors, que je le prévoyais, ".properties" est bien présent. Donc désolé les gars, mais c'est pas ça (je modifie le premier post pour ne pas tromper quelqu'un d'autre) C'est désepérant... Je poste la scène compléte qui bug (un peu long mais pas compliquée) --[[ %% properties %% events %% globals --]] --[[ Scène qui met à jour les WakeUpTime des modules au maximum, suivant les infos trouvés dans la notice --]] --décalration des variables************************************************* local debug = true --true/false variable pour afficher le debug local simul = false --true/false permet de simuler avant de modifier local device = api.get("/devices/") --liste tous les devices local texte = "" --texte pour le debug local nbDevice = 0 --compteur de device à pile total local nbDeviceUpdateOK = 0 --compteur de device mis à jour OK local nbDeviceUpdateNOK = 0 --compteur de device mis à jour NOK local nbDeviceOK = 0 --compteur de device OK local nbDeviceNOK = 0 --compteur de device NOK local typeDevice = { {type = "com.fibaro.remoteController", zwaveCompany = "ID-RF", up = 0, maxTime = 0}, {type = "com.fibaro.doorSensor", zwaveCompany = "Fibargroup", up = 1, maxTime = 64800}, {type = "com.fibaro.FGMS001v2", zwaveCompany = "Fibargroup", up = 1, maxTime = 65535}, {type = "com.fibaro.FGFS101", zwaveCompany = "Fibargroup", up = 1, maxTime = 18000}, {type = "com.fibaro.thermostatDanfoss",zwaveCompany = "Danfoss", up = 1, maxTime = 600}, {type = "com.fibaro.FGMS001", zwaveCompany = "Fibargroup", up = 1, maxTime = 65535}, {type = "com.fibaro.temperatureSensor",zwaveCompany = "Horstmann Controls Limited", up = 1, maxTime = 86400}, {type = "com.fibaro.temperatureSensor",zwaveCompany = "Everspring", up = 1, maxTime = 16056000}, {type = "com.fibaro.motionSensor", zwaveCompany = "Philio Technology Corp", up = 1, maxTime = 432000} } --fonction pour afficher le debug******************************************* function afficheDebug(message, color, afficheDebug) if afficheDebug == true then if message and color then print("<font color = '"..color.."'>"..message.."</font>") else print("<font color = 'yellow'>afficheDebug : error</font>") end end end --MAIN********************************************************************** --entête de debug if simul == true then afficheDebug("MODE SIMULATION : AUCUNE MODIFICATION EST APPLIQUEE.", "yellow", true) end afficheDebug("DEFINITIONS : id, name, wakeUpTime, type, zwaveCompany", "white", debug) --pour tous les device for i,v in ipairs(device) do -- filtre que les device à pile et visible if device[i].properties.wakeUpTime and device[i].visible == true then --pour tous les éléments de typeDevice for j,w in ipairs(typeDevice) do --si le type et zwaveCompany sont identiques if device[i].type == typeDevice[j].type and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then --récupère les infos du device id = device[i].id name = device[i].name type = device[i].type zwaveCompany = device[i].properties.zwaveCompany --construit le texte pour le debug if debug == true then texte=id..", "..name..", "..device[i].properties.wakeUpTime.." s, "..type..", "..zwaveCompany end --si wakeUpTime différent de maxTime du tableau if device[i].properties.wakeUpTime ~= typeDevice[j].maxTime then afficheDebug(texte,"red", debug) nbDeviceNOK=nbDeviceNOK+1 --inc compteur NOK --si le champ UP est à 1 alors mise à jour if tonumber(typeDevice[j].up) == 1 then --mise à jour du wakeUpTime avec valeur du tableau if simul == false then -- pas executée en mode simulation local Value=api.get("/devices/"..device[i].id) Value.properties.wakeUpTime = typeDevice[j].maxTime api.put("/devices/"..device[i].id, Value) end fibaro:abort() --construit le texte pour le debug de mise à jour if debug == true then texte="Device "..device[i].id.." ("..device[i].name..") wakeUpTime mis à jour avec "..typeDevice[j].maxTime.." s." end afficheDebug(texte, "orange", debug) nbDeviceUpdateOK=nbDeviceUpdateOK+1 --inc compteur update OK else --si pas de mise à jour demandée (up = 0) --construit le texte pour le debug de mise à jour if debug == true then texte="Device "..device[i].id.." ("..device[i].name..") wakeUpTime non mis à jour." end afficheDebug(texte, "Magenta", debug) nbDeviceUpdateNOK=nbDeviceUpdateNOK+1 --inc compteur update NOK end else --sinon OK (wakeUpTime différent de maxTime du tableau) afficheDebug(texte, "green", debug) nbDeviceOK=nbDeviceOK+1 --inc compteur OK end nbDevice=nbDevice+1 --inc compteur device end end end end --affichage résultat print("------------------------------") afficheDebug("Total device détectés = "..nbDevice, "white", true) afficheDebug("Total device OK = "..nbDeviceOK, "green", true) afficheDebug("Total device NOK = "..nbDeviceNOK, "red", true) afficheDebug("Total device mis à jour OK = "..nbDeviceUpdateOK, "orange", true) afficheDebug("Total device mis à jour NOK = "..nbDeviceUpdateNOK, "Magenta", true) On retrouve le api.put qui m....
jjacques68 Posté(e) le 27 septembre 2017 Auteur Signaler Posté(e) le 27 septembre 2017 (modifié) J'AI TROUVE !! enfin!!!! p... de b... de m... c'était long ! ça vient pas du tout de mes api.put, api.get... voilà ce qui est en défaut (présent dans le 2ème script et pas dans le 1er): --récupère les infos du device id = device[i].id name = device[i].name type = device[i].type zwaveCompany = device[i].properties.zwaveCompany la variable "type" qui est un mot clé réservé : type = device.type J'ai remplacé par ceci : idDev = device[i].id nameDev = device[i].name typeDev = device[i].type zwaveCompanyDev = device[i].properties.zwaveCompany et ça a marché du premier coup ... ... pourri le debug lua !!!! bref, merci pour votre participation ! PS: question bête on peut réveiller un module sans avoir a se déplacer vers lui pour triple cliquer sur le bouton ? Modifié le 27 septembre 2017 par jjacques68
pepite Posté(e) le 27 septembre 2017 Signaler Posté(e) le 27 septembre 2017 Felicitations. J'avais bien parlé du type :-) Baisse le wakeuptime en lua non?Envoyé de mon Nexus 5X en utilisant Tapatalk
jjacques68 Posté(e) le 27 septembre 2017 Auteur Signaler Posté(e) le 27 septembre 2017 mouai... Le but de la scène sera de mettre les wakeuptime à leur maximum en une fois. 1
Messages recommandés