Aller au contenu

"reset" D'un Virtual Device


jimbo007be

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

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é par Krikroff
Lien vers le commentaire
Partager sur d’autres sites

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 :lol:

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

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.

Lien vers le commentaire
Partager sur d’autres sites

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
  • Upvote 2
Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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"}})
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...