Krikroff Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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
Shad Posté(e) le 17 janvier 2014 Auteur Signaler Posté(e) le 17 janvier 2014 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
Krikroff Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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
Shad Posté(e) le 17 janvier 2014 Auteur Signaler Posté(e) le 17 janvier 2014 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.
Krikroff Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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.
Shad Posté(e) le 17 janvier 2014 Auteur Signaler Posté(e) le 17 janvier 2014 Déjà essayé dans un if Je vais réessayer autrement.
Krikroff Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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: 1
i-magin Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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"
sebcbien Posté(e) le 27 février 2015 Signaler Posté(e) le 27 février 2015 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...
Krikroff Posté(e) le 27 février 2015 Signaler Posté(e) le 27 février 2015 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
sebcbien Posté(e) le 27 février 2015 Signaler Posté(e) le 27 février 2015 Bon, ok, je vais mettre ça derrière un bouton et demander àgea d'appuyer dessus, délicatement ! ;-)
sebcbien Posté(e) le 27 février 2015 Signaler Posté(e) le 27 février 2015 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 ?
mccyrille Posté(e) le 4 mars 2015 Signaler Posté(e) le 4 mars 2015 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
CASINOS Posté(e) le 15 mars 2015 Signaler Posté(e) le 15 mars 2015 Bonjour, j'ai le même problème que vous Ci-dessous le lien de mon post http://www.domotique-fibaro.fr/index.php/topic/3994-probl%C3%A8me-avec-jsondecode-en-v36-puis-en-v4/ je serais également intéressé par ton nouveau php Merci
sebcbien Posté(e) le 15 mars 2015 Signaler Posté(e) le 15 mars 2015 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
971jmd Posté(e) le 17 avril 2017 Signaler Posté(e) le 17 avril 2017 (modifié) 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é le 17 avril 2017 par 971jmd
971jmd Posté(e) le 17 avril 2017 Signaler Posté(e) le 17 avril 2017 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
Messages recommandés