Aller au contenu

Messages recommandés

Posté(e)

Il peut arriver lorsqu'un script dépend d'un traitement extérieur comme par exemple l'appel d'un service web qui retourne un json, que le script ne s’exécute pas correctement jusqu'au bout, les raisons peuvent être multiples: timeout, service indisponible etc.

 

C'est pourquoi il peut être utile dans certaines conditions de relancer l’exécution du script jusqu’à  obtention du résultat attendu.

 

Voici comment faire:

-- Copyright © 2013 Jean-christophe Vermandé

local _selfId = fibaro:getSelfId();

-- update Public IP label
httpClient = Net.FHttp("checkip.dyndns.com");

-- recursive function to ping device
function checkIP(retry)
  retry = retry or 0;
  -- call domaine to check
  response, status, errorCode = httpClient:GET("/");
  -- check for error
  if errorCode == 0 then
    -- Internet connection is alive :-)
    fibaro:setGlobal("NetworkStatus", 1);
    if tonumber(status) == 200 then
      local ip = response:match("(%d%d?%d?.%d%d?%d?.%d%d?%d?.%d%d?%d?)");
      fibaro:call(_selfId, "setProperty", "ui.lblPublicIP.value", ip);
    else
      fibaro:call(_selfId, "setProperty", "ui.lblPublicIP.value", "Error!");
    end
  else
    if retry < 5 then
      fibaro:debug("Retry #"..retry.."process, please wait...");
      fibaro:sleep(1000);
      return checkIP(tonumber(retry+1));
    end
    -- Internet seems down, check connection...
    fibaro:setGlobal("NetworkStatus", 0);
    fibaro:call(_selfId, "setProperty", "ui.PublicIPLabel.value", "Unknown");
    -- send mail      
    fibaro:call(2, "sendEmail", "Check Network Status failed !", "Unable to check network status, error code is "..errorCode..
      ", response is ["..response.."]"); 
  end
end

-- execution de la fonction
checkIP();

-- clean memory, destroy object
httpClient = nil;

Ce code interroge le service checkip.dyndns.com pour vérifier l'adresse IP, si le service est en erreur ou bien un problème avec FHttp, alors le script est relancé une nouvelle fois. Si au bout d'un maximum de 5 tentatives il y a toujours une erreur alors un mail est envoyé.

 

La fonction récursive peut être dans d'autres cas: algorithme, calcul etc.

×
×
  • Créer...