Aller au contenu
jjacques68

net.HTTPClient contourner l'asynchrone c'est possible ?

Recommended Posts

bonjour à tous, question de programmation pure et dure ;) 

 

Je suis confronté à un problème plutôt bloquant me concernant.

 

Dans une scène (gestion de 12 mi-flora avec VD, consignes d'humidité, alertes mail, ... bref), je souhaite créer des variables globales dynamiquement.

j'utilise pour cela ce bout de code (simplifié), qui marche très bien, placé dans une fonction :

function TestGlobal(id)
  local http = net.HTTPClient()  
   
  if fibaro:getGlobal(id) == nil then --si pas de VG
    --nouvelle variable    
    newVar = {}
    newVar.name = id
    newVar.value = "0"
        
    http:request("http://127.0.0.1:11111/api/globalVariables", {
      options = {method = 'POST', data = json.encode(newVar)},
      success = function(response) print("Création de la variable "..id) end,
      error = function(response) print("Error: " ..response) end,
    })
  end
end

MAIS cette fonction est appelée en premier, pour ensuite exécuter d'autres fonctions utilisant justement les VG créées.

 

Et bien ça marche pô ! :13:

Si j'analyse bien mon script complet, les VG ne sont même pas créées !!!! J'ai pas le print du success !!!! ni celui du error...

 

pourquoi ????

 

Et le plus dingue, c'est que si je n'exécute pas les fonctions qui suivent, celle de la création de VG fonctionne très bien, les VG sont alors crées !!!

 

d'après mes recherches et essais cela viendrait du mode asynchrone de l'execution du net.HTTPClient.

Mais alors comment le contourner ???

 

J'ai déjà été confronté à ce genre de soucis, que j'ai pu contourner en imbriquant les net.HTTPClient , mais le code devient très illisible et compliqué.

(exemple pour des scènes qui gère la patrouille de caméras, 7 positions PTZ déterminées = 7 net.HTTPClient  qui s'imbriquent :74:)

 

Mais la clairement dans ma scène actuelle, je ne peux pas faire ce genre d'emboitement.

 

Merci pour votre aide !!

 

 

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @jjacques68

On n'oublie pas, je ne suis pas dev ;-) mais je propose ;-).

 

Et si tu essayais avec les api.get et api.post, les fonctions existantes de fibaro ;-)

 

Elles utilisent Net.FHttp et non pas net.HTTPClient, mais je ne sais pas si net.FHttp est asynchrone ;-) . Je vais jeter un oeil.


 

function TestGlobal(id)
    local vg = api.get("/globalVariables/"..id)
    if vg == nil or "" then
        --nouvelle variable    
        newVar = {}
        newVar.name = id
        newVar.value = "0"

        api.post("/globalVariables", newVar)
    end
end

Les fonctions api de la HC2 ;-)

-- api class implementation
api = {}

api.get = function(uri)
    uri = "/api" .. uri
    local http = Net.FHttp("127.0.0.1", 11111)
    local result, status, errorCode = http:GET(uri)
    if result ~= "" then
        return json.decode(result)
    else
        return ""
    end
end
    

api.put = function(uri, data)
    uri = "/api" .. uri
    local http = Net.FHttp("127.0.0.1", 11111)
    local jsonData = json.encode(data)
    local result, status, errorCode = http:PUT(uri, jsonData)
    if result ~= "" then
        return json.decode(result)
    else
        return ""
    end
end


api.post = function(uri, data)
    uri = "/api" .. uri
    local http = Net.FHttp("127.0.0.1", 11111)
    local jsonData = json.encode(data)
    local result, status, errorCode = http:POST(uri, jsonData)
    if result ~= "" then
        return json.decode(result)
    else
        return ""
    end
end

 

 

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

HS,

pas mal ces capteurs, tu peux partager qq screenshots de ton VD pour voir ?

elles sont utilisables en exterieur ?

 

merci

Partager ce message


Lien à poster
Partager sur d’autres sites

@pepite faut que je teste, mais on est d'accord je suis dans une scène avec mon code là !

 

@Sakkhho je te mettrai un screenshot pas de soucis, et oui j'en ai un à l'extérieur, tant que tu es à porté du Bluetooth...

 

Mais la tout de suite faut que je tire 2 câbles Ethernet de la cave aux combles :(:(:(

 

merci !! 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

oui oui on est d'accord ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

ok, je suis intéressé de savoir comment tu integres tout ceci

quand tu as le temps :-) 

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais j'avais regardé, ils ne sont plus en vente si ?

Partager ce message


Lien à poster
Partager sur d’autres sites

heuu..@Nico qu'est-ce qui n'est plus en vente ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

YES @pepite !!!! nickel !!!

function TestGlobal(id)
    local vg = api.get("/globalVariables/"..id)
    if vg == nil or "" then
        --nouvelle variable    
        newVar = {}
        newVar.name = id
        newVar.value = "0"

        api.post("/globalVariables", newVar)
    end
end

merciiiiiii !!!!

 

@Nico, si tu parles des mi flora, ils sont toujours en vente...

 

Je vais faire un petit tuto pour mon installation avec les mi flora...

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Un miracle, c'est à cause de moi le mauvais temps ;-)

 

ahh, @Nico

c'est mi-plant sur gearbest on ne trouve plus mi-flora (en tout cas pour moi sur gearbest)

Partager ce message


Lien à poster
Partager sur d’autres sites

Dites je reviens sur ce post car mes soucis avec le routeur et les modem ADSL/4G (pour ceux qui ont pas suivi), m'ont donnés une idée :2:

 

dans les requêtes http (pas l'api de la HC2, rien a voir ce coup si...)

local http = net.HTTPClient()  
 
http:request("blablabla...", {
   success = function(response) print("Création de la variable "..id) end,
   error = function(response) print("Error: " ..response) end,
})

existe-il une option Timeout qui permettrait en cas de pas de réponse d'exécuter une action ?

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

 

Oui oui :

local httpClient = net.HTTPClient({ timeout = 2000 })
Ensuite pour moi la gestion du timeout si tu veux faire une autre action se gere dans la fonction error non ?

Partager ce message


Lien à poster
Partager sur d’autres sites

donc après le timeout, ca ferme le httpclient ?

alors la, attendons le passage des experts, je n'en sais pas plus, je ne sais donc pas quel effet à le timeout sur le net.HTTPClient

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai essayé ça mais sans résultat (fallait que j'essaye :) )

local http = net.HTTPClient({ timeout = 2000 })  
 
http:request("blablabla...", {
   success = function(response) print("success") end,
   error = function(response) print("Error: " ..response) end,
   timeout = function(response) print("Timeout") end,
})

 

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

oui bonne idee le nouveau post mais tu n'as pas mis le timeout au bon endroit ;-)

mets le dans la declaration de la variable http pour voir

Partager ce message


Lien à poster
Partager sur d’autres sites

oups désolé, ça vient du copier/coller...

 

dans la scène il est au bon endroit... merci !

Partager ce message


Lien à poster
Partager sur d’autres sites

×