Aller au contenu
Shad

Empêcher une function de bloquer un script

Recommended Posts

je pense que tu devrais faire une double vérification comme cela
 

if (t ~= nil) then
  if (t.result~= nil ) then
    -- todo
  end
else
  -- todo
end

autre solution, très important à  savoir,  il est possible de forcer "inline" la valeur d'une variable comme ceci:

local myStringVar = pExtValue or "";

ici, si pExtValue est null alors automatiquement lua utilisera "" à  la place :) . une valeur par defaut quoi ...

 

Si tu veux, tu peux essayer ma librairie lua ici http://forum.fibaro.com/viewtopic.php?t=3207 (il faut d’ailleurs que j' ajoute un tuto ici) pour faire des requêtes avancées...

 

Courage :60:

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui mais maintenant sa tourne en boucle, mais rien ne s'affiche.

Non sérieux faut vraiment qu'il fasse quelque chose pour sa. Et sa doit leur prendre 1h a rajouter une fonction pour recharger le main loop.

Et àvrai dire je comprend pas trop ta librairie :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Je peux te faire un exemple si tu le souhaite ;) pour la librairie: en gros tu mets dans ton main loop en haut les parties:

 

Pour commencer: Toolkit, Toolkit.Debug, Toolkit.Net, Toolkit.Net.HttpRequest puis tu peux utiliser les functions et pseudos objets

 

Tk.assertArg("strArg", strArg, "string"); pour valider qu'un argument est de type chaîne...

Tk:trace("value is %d", 35); ou Tk:traceEx("green", "value is %d", 35); pour sortir une trace dans la fenêtre debug à  la manière d'un string.format et en couleur stp !

local httpClient = Tk.Net.HttpRequest(HOST, PORT); -> pour faire une requête de n'importe quel type (j'utilise un socket TCP pour cela)...

 

Et beaucoup de choses encore... le code source est documenté.

 

Après il n'y a pas de raison, nous devrions pouvoir faire un simple json.decode et FHttp sans toutes ces galères !

 

Sinon je suis ok avec toi, cela ne devrait pas prendre beaucoup de temps aux Dev Fibaro pour ajouter un fibaro:refreshMainLoop();

 

Juste que je ne comprends toujours pas pourquoi tu as besoin de cela, j'ai bien intégré qu' il y a un problème et que le script plante ! Mais l'ajout d'une telle fonction ne réglera pas le problème, juste utile pour le contourné et serait la porte ouverte à  faire tourner des scripts non optimisé et/ou avec des bugs!

 

PS: je ne parle pas de ton code (je sais que tu maîtrise ;) l'ami),

 

Ex: J'ai bossé sur le script NetAtmo de i-magin, j'ai debuggé, puis patché, le script est aujourd’hui' hui fonctionnel, même en cas d'erreur le loop n'est pas bloqué, et nous avons mis certainement en évidence le fait que les serveurs NetAtmo ne sont pas opérationnel 24h/24h :huh:

Partager ce message


Lien à poster
Partager sur d’autres sites

Je peux être d'accord avec toi, pour le refresh.

 

Mais dans ce cas, il faudrait avoir une possibilité de réinitialiser la connexion FHttp.

 

Dis moi si tu utilises xbmc chez toi que je passes tout (plugin xbmc, virtual device), car tu verras que le script marche sans aucun soucis.

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai un mac mini dans un placard avec XBMC dessus, il faut juste que je le rebranche ce soir...

 

Pour FHttp lorsque tu déclares par exemple un objet objFHttp=Net.FHttp("XX"); , si tu veux détruire la connexion un simple objFHttp=nil; est suffisant pour détruire l'objet donc réinitialiser la connexion avec l’hôte.

Partager ce message


Lien à poster
Partager sur d’autres sites

Déjà  essayé dans un if :D

 

Je vais réessayer autrement.

Partager ce message


Lien à poster
Partager sur d’autres sites

Voici les modifications que j'ai apporté au code de i-magin (publié avec son accord):

 

Edit: mise à  jour du code du Main() pour renforcer la prévention des erreurs type T_END, Unknown etc..
 

--[[
%% autostart
%% properties
%% globals
--]]

fibaro:debug("process start");

selfId = fibaro:getSelfId();

local domaine = "www.xxxxxxxxxx.com";

if (temperature_exterieure==nil) then temperature_exterieure = ""; end
if (humidite_exterieure==nil) then humidite_exterieure = ""; end
if (temperature_interieure==nil) then temperature_interieure = ""; end
if (humidite_interieure==nil) then humidite_interieure = ""; end
if (co2==nil) then co2 = ""; end
if (pression==nil) then pression = ""; end
if (bruit==nil) then bruit = ""; end

--ne charger en mémoire uniquement que à  la premiere execution
if(refreshUI==nil) then
function refreshUI(temp, hum, press, co2, bruit)
  fibaro:call(selfId,"setProperty","ui.temperature.value",temp);
  fibaro:call(selfId,"setProperty","ui.humidite.value",hum);
  fibaro:call(selfId,"setProperty","ui.pression.value",press);
  fibaro:call(selfId,"setProperty","ui.co2.value",co2);
  fibaro:call(selfId,"setProperty","ui.bruit.value",bruit);  
end;
end
--ne charger en mémoire uniquement que à  la premiere execution
if(getExt==nil) then
function getExt(retry)
  retry = retry or 0
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo extérieur
  local response = FHTE:GET("/netatmo/netatmo.php?intext=ext");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_exterieure = result.body[1].value[1][1] or "n.c";
        humidite_exterieure =result.body[1].value[1][2] or "n.c";
        -- variable globale pour info sms
        local msg = "Température extérieure : "..temperature_exterieure.."°C";
        fibaro:setGlobal("tempext", msg);
        return true;
      else
        fibaro:debug("Netatmo EXT: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo EXT: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo EXT:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getInt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

--ne charger en mémoire uniquement que à  la premiere execution
if(getInt==nil) then  
function getInt(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?intext=int");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_interieure = result.body[1].value[1][1] or "n.c";
        humidite_interieure = result.body[1].value[1][3] or "n.c";          
        co2 = result.body[1].value[1][2] or "n.c";
        pression = result.body[1].value[1][4] or "n.c";
        bruit = result.body[1].value[1][5] or "n.c";
        -- variable globale pour info sms
        fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

local function main()
  -- demande au service web les informations...
  local resInt, resExt = false, false;
  local status, err = pcall(function () resInt = getInt(); end);
  fibaro:debug("Récupération des données interieurs: " .. tostring(resInt));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  local status, err = pcall(function () resExt = getExt(); end);
  fibaro:debug("Récupération des données extérieurs : " .. tostring(resExt));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  -- affichage infos dans module virtuel         
  refreshUI(
    temperature_interieure.." °C / "..temperature_exterieure.." °C",
    humidite_interieure.." % / "..humidite_exterieure.." %",
    pression.." mbar",
    co2.." ppm",
    bruit.." dB"
  );
  -- tempo de 30 secondes
  fibaro:sleep(30*60*1000);
end

-- lance le script à  chaque loop
main();

La sortie debug:

gallery_3_20_2085.png

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @Krikroff, joli boulot 

Qui se transforme en un bon tuto, partagé avec l'ensemble des membres du forum

 

PS: je ne regarderai le code vraisemblablement pas avant lundi... pas mal de choses "sur le feu"

Partager ce message


Lien à poster
Partager sur d’autres sites

je ne sas pas vous, mais moi, malheureusement il ne récupère jamais, même après 4H (toutes les 10 minutes) j'ai toujours un retour false.

un save du VD et ça repart pour 1 ou 2 jour...

Partager ce message


Lien à poster
Partager sur d’autres sites

Le problème est au niveau du script PHP qui ne gère pas les erreurs je pense et aussi de Netatmo qui retourne des données foireuses régulièrement. Et comme la librairie json du HC2 dans les VD est très sensible c'est la catastrophe

Envoyé de mon smartphone

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon, ok, je vais mettre ça derrière un bouton et demander àgea d'appuyer dessus, délicatement ! ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Je suis occupé à  ré-écrire le php, je compte le partager une fois terminé.

 

As-tu déjà  une idée quelle erreur récurrente le php ne gère pas ?

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai moi même essayé aussi le script de krikroff car j'avais le problème du T_END...

 

voici mon code php ; une page php vraiment tout simple... C'est le format json que doit me rendre une autre page php qui elle fait la requête... Elle marche bien mais met 3 - 4s à  répondre donc je pensais que le script lua n'attendait pas la réponse et continuait à  s'executer... C'est pourquoi j'ai fais cet essai vraiment tout simple pour voir si c'était juste le temps de réaction qui coinçait...

<?php 
echo "{\"Int\":{\"Temp\":18,\"CO2\":1102,\"Humid\":57,\"Press\":1034.8,\"Bruit\":41},\"Ext\":{\"Temp\":4.1,\"Humid\":92,\"Bat\":71},\"Pluie\":{\"p1h\":0,\"p24h\":0.1,\"Bat\":100}}";
?>

On peut pas faire plus rapide lol

 

Eh ben non, pareil ; problème du T_END... ça boucle 5 fois donc, mais je ne récupère rien du tout... 

 

Est-ce que c'est WAMP Server qui fou un T_end au début du retour ? Est-ce que c'est fibaro qui fait encore des siennes... ??

 

Ca commence à  me les casser toutes ces requêtes et retour pas logique là ... Pfffff

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

voici le nouveau script PHP.

Ceci dit, pour gérer les retours faux, je le fais avec GEA, (même fil)

 

http://www.domotique-fibaro.fr/index.php/topic/3929-yagda-yet-another-graphic-data-analyser-netatmo-vmc-emoncms-json-viewer/#entry56852

Partager ce message


Lien à poster
Partager sur d’autres sites

salut a tous :)

 

j'ai un petit probleme avec le code suivant, j'ai un Error Code: 2 :(

 

Mai si j’exécute le lien http suivant,  ma base ce mes très bien a jour

 

http://localhost:8080/domotiquefibaro/fibaro_add.php?timestamp=20170416180257&type=garage&value=100

 

pour info, le script  PHP (fibaro_add.php) a pour but de mettre a jour une base MSQL

 

 

 

--[[
%% properties
33 value
%% globals
--]]

local IP = "localhost"
local Port = "8080"
local HC2 = Net.FHttp(IP,Port)


local timestamp = os.date("%Y%m%d%H%M%S")
local type = "Temp_Salonsalon"
local valuetosyno = fibaro:getValue(33, "value")

fibaro:debug(timestamp)
fibaro:debug(type)
fibaro:debug(valuelampe)

local result, status, errorCode = HC2:GET("/domotiquefibaro/fibaro_add.php?timestamp="..timestamp.."&type="..type.."&value="..valuelampe.."")                 
                                         

fibaro:debug("Result: " .. result);
fibaro:debug("Status: " .. status);
fibaro:debug("Error Code: " .. errorCode);
[DEBUG] 23:13:22: 20170416231322
[DEBUG] 23:13:22: Temp_Salonsalon
[DEBUG] 23:13:22: 99
[DEBUG] 23:13:22: Result:
[DEBUG] 23:13:22: Status:
[DEBUG] 23:13:22: Error Code: 2

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

si je test avec 192.168.0.16 au lieu de localhost:

 

1
DémarrerArrêterNettoyer [DEBUG] 23:58:20: 20170416235820
[DEBUG] 23:58:20: Temp_Salonsalon
[DEBUG] 23:58:20: 99
[DEBUG] 23:58:20: Result:
Forbidden
You don't have permission to access /domotiquefibaro/fibaro_add.php on this server.
Apache/2.4.23 (Win64) PHP/5.6.25 Server at 192.168.0.16 Port 8080

[DEBUG] 23:58:20: Status: 403
[DEBUG] 23:58:20: Error Code: 0

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×