Aller au contenu

Messages recommandés

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
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
Posté(e)

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

 

Posté(e)

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
Posté(e)

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)

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
Posté(e)

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 ?
Posté(e)

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

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
Posté(e)

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

×
×
  • Créer...