Welcome to Domotique-fibaro

 

Inscrivez-vous maintenant pour accéder à toutes nos fonctionnalités. Une fois inscrit et connecté, vous serez en mesure de contribuer à ce site en soumettant votre propre contenu ou en répondant au contenu existant. Vous serez en mesure de personnaliser votre profil, de recevoir des points de réputation comme une récompense pour la soumission de contenu, tout en communiquant avec d'autres membres via votre boîte de réception privée, et bien plus encore! Ce message sera supprimé une fois que vous vous êtes connecté.

 

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

jjacques68

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

Posté(e) (modifié)

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
0

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

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
0

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

0

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 !! 

 

0

Partager ce message


Lien à poster
Partager sur d’autres sites

oui oui on est d'accord ;-)

0

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

0

Partager ce message


Lien à poster
Partager sur d’autres sites

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

0

Partager ce message


Lien à poster
Partager sur d’autres sites

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

0

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...

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)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

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
0

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 ?
0

Partager ce message


Lien à poster
Partager sur d’autres sites

attend je teste...

0

Partager ce message


Lien à poster
Partager sur d’autres sites

J'attends ;-) sagement ;-)

0

Partager ce message


Lien à poster
Partager sur d’autres sites

ben non le timeout est pas traiter par la fonction error :( 

0

Partager ce message


Lien à poster
Partager sur d’autres sites

il me plante la scène...

0

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

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

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
0

Partager ce message


Lien à poster
Partager sur d’autres sites

je vais peut être créé un nouveau post non ?

0

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

0

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 !

0

Partager ce message


Lien à poster
Partager sur d’autres sites