jimbo007be Posté(e) le 2 février 2014 Signaler Posté(e) le 2 février 2014 Bonjour Malgré toutes mes tentatives pour avoir un code stable pour le vitual device associé à ma Sunny WebBox (je vois d'ici Krikroff qui se marre), celui-ci se plante encore (errocode = 2) systèmatiquement après un temps aléatoire (parfois long) de fonctionnement ... d'où ma question : est-ce qu'il y a un moyen, une commande magique, pour faire un "reset" de virtual device et le relancer ? merci d'avance de vos réponses
Shad Posté(e) le 2 février 2014 Signaler Posté(e) le 2 février 2014 Perso j'en ai ma trouvé, je te conseille de mettre ton code dans un bouton et d'appeller le bouton dans le main loop
Krikroff Posté(e) le 2 février 2014 Signaler Posté(e) le 2 février 2014 C'est maintenant j'en suis quasi certain (99% / 100%) un problème de JSON mal formé qui fait planter la librairie json du HC2 qui alors tourne sans fin avec un While...true et le message d'erreur T_END etc, je pense à une mauvaise gestion d'erreur dans cette librarie... La solution est la suivante mais c'est du bidouillage !! il faut tester le json.decode dans un pcall (j'ai fait une fonction pour ça dans le LUA framework) et si tout va bien continuer l’exécution et si erreur relancer son code, tout cela n'est valable qu'en cas d'utilisation de fonction pour isoler son code . Avant de prendre la tête à Igor ou Andrew avec ça j'essaye de mettre en place une procédure de test pour soulever le problème à tous les coups.
Shad Posté(e) le 2 février 2014 Signaler Posté(e) le 2 février 2014 déjàtest krikroff, mais sa change rien. J'avais vérifier dans un pcall if empty.
jimbo007be Posté(e) le 2 février 2014 Auteur Signaler Posté(e) le 2 février 2014 krikroff : preneur si tu trouves une solution évidemment
Krikroff Posté(e) le 2 février 2014 Signaler Posté(e) le 2 février 2014 Tester la réponse du socket avec cette fonction par ex: isValidJson(data, false); puis si true alors utiliser ensuite json.decode si false alors gestion d'erreur ou pause de x secondes puis nouvelle tentative ... mais il est possible que cela ne reponde pas à toutes les problématiques code du framework: -- raiseError(message, level) -- message (string) - message -- level (integer) - level raiseError = function(message, level) error(message, level); end -- isValidJson(data, raise) -- data (string) - data -- raise (boolean)- true if must raise error -- check if json data is valid isValidJson = function(data, raise) if (string.len(data)>0) then if (pcall(function () return json.decode(data) end)) then return true; else if (raise) then raiseError("json error", 2) end; end end return false; end
i-magin Posté(e) le 21 février 2014 Signaler Posté(e) le 21 février 2014 Bonjour JC ! Toujours en lutte avec ce problème de JSON Je pense "reprendre du service" durant le week-end.... voire après
jimbo007be Posté(e) le 21 février 2014 Auteur Signaler Posté(e) le 21 février 2014 i-magin : très intéressé aussi, si tu trouves THE solution
Krikroff Posté(e) le 21 février 2014 Signaler Posté(e) le 21 février 2014 (modifié) Salut i-magin , C'est une vrai galère cette librairie JSON, d’ailleurs en passant j'ai remonté un autre bug sur le bugtracker à propos de la lib JSON avec un problème de PUT avec un JSON un peu complexe ! J'ai pu mettre en évidence chez moi que le Mainloop et le JSON plante lorsqu'il y a une coupure du réseau: résultat While ... T_END et patatra... La solution que j'ai trouvé temporairement pour faire un reset du MainLoop est de faire ceci: function reloadMainloop() local selfId = fibaro:getSelfId(); local HC2 = Net.FHttp("192.168.1.xxx", 80); HC2:setBasicAuthentication("admin", "password"); local response ,status, errorCode = HC2:GET("/api/virtualDevices?id="..selfId); if (tonumber(status) == 200) then local json = json.encode(json.decode(response)); local response2 ,status2, errorCode2 = HC2:PUT("/api/virtualDevices?id="..selfId, json); if (tonumber(errorCode2)==0) then fibaro:debug("Edit complete text set "..status2) else fibaro:debug("Error update "..errorCode2) end else fibaro:debug("error"); end end Ce code charge en mémoire le code du device et le réinjecte "simulant" l'action d'enregistrer le VD Edit: Sinon je vais essayer aussi avec ma librairie LUA car je n'ai jusqu’à présent ce problème qu'avec FHttp et dans ma lib j'utilise un socket TCP pour toutes les requêtes... JC. Modifié le 21 février 2014 par Krikroff
i-magin Posté(e) le 21 février 2014 Signaler Posté(e) le 21 février 2014 i-magin : très intéressé aussi, si tu trouves THE solution Houlà ! je me suis mal fait comprendre ! C'est @Krikroff le spécialiste... moi, je ne sais que tester ce qu'il fait
Krikroff Posté(e) le 21 février 2014 Signaler Posté(e) le 21 février 2014 Mouais enfin tout seul j'suis comme un c.. hein ! Je suis sincèrement convaincue que c'est dans le partage des expériences et donc de la connaissance que les choses avancent Tu n'es pas prêt d’arrêter de tester des trucs alors
jimbo007be Posté(e) le 21 février 2014 Auteur Signaler Posté(e) le 21 février 2014 àvotre dispo aussi si il faut tester qq chose bien entendu
Gazous Posté(e) le 30 juillet 2015 Signaler Posté(e) le 30 juillet 2015 Bonjour, j'ai testé le code proposé plus haut par Krikroff et pour moi cela ne fonctionne pas. Si je teste le résultat de l'appel /api/virtualDevices?id=XXX, il renvoi la liste de tous les Virtual Devices et non celui correspondant à l'id passé en paramètre. Cela renvoi en fait le même résultat que /api/virtualDevices.
Gazous Posté(e) le 30 juillet 2015 Signaler Posté(e) le 30 juillet 2015 Je me réponds àmoi même et voici le code àutiliser en V4 car l'API a changé A mettre dans un bouton et ça fonctionne parfaitement avec quelques optimisations au passage. local selfId = fibaro:getSelfId() local HC2 = Net.FHttp("127.0.0.1", 11111) local response ,status, errorCode = HC2:GET("/api/virtualDevices/"..selfId) if tonumber(status) == 200 then local response2 ,status2, errorCode2 = HC2:PUT("/api/virtualDevices/"..selfId, response) if tonumber(errorCode2) == 0 then fibaro:debug("Device Successfully Restarted ! (status = "..status2..")") else fibaro:debug("Error update "..errorCode2) end else fibaro:debug("error") end 2
pepite Posté(e) le 8 septembre 2015 Signaler Posté(e) le 8 septembre 2015 Salut Gazous, Et tu utilises le mainloop pour appuyer sur le bouton ? Et le meme genre pour une scene ? Ca devrait fonctionner aussi non ?
Gazous Posté(e) le 8 septembre 2015 Signaler Posté(e) le 8 septembre 2015 Ha non surtout pas ! Si tu utilises la Mainloop pour appuyer sur le bouton et que la Mainloop est bloquée, il ne redémarrera jamais. Tu peux faire ça depuis une scène ou GEA par exemple, le code suivant appuyé sur le bouton 10 du VD avec l'id 228 tous les soirs à23h30 GEA.add(true, 60, "", {{"VirtualDevice", 228, 10},{"Time", "23:30", "23:30"}})
Messages recommandés