Aller au contenu

Messages recommandés

Posté(e)

Je n'avais pas pensé à ça, mais c'est évident maintenant, il faut s’authentifier à chaque fois pour obtenir un token que tu pourras utiliser dans la suite de ton code.

 

Tu as plusieurs exemples sur le forum, mais tu peux t'inspirer du code que j'ai fait dans le tuto de détection de présente Unifi

Il y a une fonction Login() qui récupère un Cookie qui est ensuite utilisé dans le Header des requêtes suivantes, mais tu peux adapter pour ton Token à la place.

 

 

  • Like 2
Posté(e) (modifié)

si j'ai bien ton code, toi tu utilises une fonction " Login " pour récupérer un cookie  dont tu as besoin pour une fonction suivante

Cookie = response.headers['Set-Cookie'] 

ET donc si ta fonction échoue, tu relance le login pour obtenir un cookie

 

			elseif response.status == 401 then  -- HTTP 401 => Unauthorized
				-- Need to login and get new cookie
				Message("orange", "Need to login and get new cookie")
				Login()
				return

moi il me semble que c'est un peut différent car même avec le bon token, j'ai besoin obligatoirement de m'identifier pour chaque requête.

j'ai donc adapter ma première requête comme ton exemple en une fonction Login(command)

 

http:request('https://airzonecloud.com/events/' .. myAuth, {
	success = function(response)
		if response.status == 201 then
			if response.data and response.data ~= "" then
				--fibaro:debug('Retour : '.. response.data)
			else
				fibaro:debug("Error : empty response data")
			end
		elseif response.status == 401 then  -- HTTP 401 => Unauthorized
		-- Need to login First
        fibaro:debug('Need to login First')
        Login(command)
        fibaro:debug("Erreur : status=" .. tostring(response.status))
        return
		end
	end,
	error = function(err)
		fibaro:debug("Erreur : " .. err)
	end,
	options = {
		method = 'POST',
      headers = {["Content-Type"] = "application/json;charset=UTF-8", ["Accept"] = "application/json, text/plain, */*", ["X-Requested-With"] = "X-Requested-With",}, 
	  data = "{\"event\":{\"cgi\":\"modzona\",\"system_number\":\"1\",\"zone_number\":\"4\",\"option\":\"state\",\"value\":1,\"device_id\":\"5a37f4167765621039320000\"}}"
	}
})

Edit

meme avec 2 fonctions  Login() pour l'identification et On() pour le changement d'etat je n'arrive pas à avoir une continuité ,

login ===> et dans la partie success ====> fonction on()

 

pourtant cela fonctionne sur apitester.com il me manque surement un lien entre les étapes

 

peut etre du coté de cela :

 

 

Mea culpa  ! C'est Ok :D .... une petite erreur de frappe dans l'un des headers :D

donc je lance simplement mes deux fonctions :

 

Login()
ON()

 

ou 

 

Login()
OFF()

 

 

Encore MERCI  @Lazer !

 

 

 

 

 

 

Modifié par Bloug
Posté(e) (modifié)

:D c'est Moi :D

si je souhaite connaitre le nombre de Zone dans mon tableau Json 

la commande c'est pas : 

 jsonTable.zones.length

pour qu'il m'indque 5 ?

 

Capture.JPG.0e8efbc41e59ccec2acd8aaede629284.JPG

 

merci :D

 

local numberZ = jsonTable.zones.length
fibaro:debug( numberZ )

toujours un nillllllll

Modifié par Bloug
Posté(e) (modifié)

En fait, selon ma compréhension, le # est un opérateur retournant la longueur d'une chaîne de caractères (#"titi" retourne 4) ou la taille d'une table.

La notion de taille d'une table est ambiguë, dans le cas d'un tableau ordonné, "sans trou", la valeur retourné correspond à la taille du tableau, ou plus exactement à la plus grande valeur de l'indice.

Dans le cas où les indices ne sont pas numériques, on a vite fait d'obtenir n'importe quoi :

local tableau = {};
for i=1, 5 do tableau[i] = i; end
fibaro:debug("1) #tableau="..#tableau); -- retourne 5
tableau["titi"] = "titi";
fibaro:debug("2) #tableau="..#tableau); -- retourne aussi 5, malgré un élément de plus...

En bref, il est souvent prudent de prévoir une fonction qui compte...

 

Pour des cas loufoques, cf. https://stackoverflow.com/questions/23590885/why-does-luas-length-operator-return-unexpected-values

Modifié par Barelle
  • Like 2
  • Thanks 1
Posté(e)
Le 11/06/2018 à 12:58, Lazer a dit :

La redirection 302 force les clients à passer en https.

Il est donc impossible de faire du http sur ce serveur.

 

Donc impossible de faire cela depuis un module virtuel avec net.fhttp().

 

La HC2 peut faire du https, mais uniquement dans une scène avec la fonction httpclient(). Voir exemples sur le forum.

 

 

Du coup, maintenant que je gère mon ensemble dans une Scene votre avis sur la méthode pour en faire un VD ?  Envoyer mes valeurs dans des VG pour les récupérer dans le VD ? c'est lourd non je vais avoir +50  VG  ? Ca ne mange pas de pain le VG ?

 

Posté(e)

Tu peux t'inspirer du couple VD + Scène que j'ai utilisé dans mon tuto Yamaha MusicCast.

Le VD appelle la scène en donnant un certain nombres de paramètres (dont l'ID du VD lui-même appelant la scène, l'ID du bouton appelant, la fonction appelée, etc). En retour, la scène est capable de mettre à jour directement les Labels du VD concerné.

 

Je te préviens, c'est assez lourd....

Posté(e)

 :/ ouai lourd :/

 

je pense que je fais alors le simplifier d'avantage avec des VG pour seulement les  :

  • Mode ( clim / chauffage / déshumidification/ ventilation )
  • Etat : ( On / Off )  
  • Sleep : 30min ; 60min ; 90min

faut que sa reste de l'interaction simple qui s'intègre facilement genre : Si Clim ON et Fenetre ouverte depuis 10min alors Push puis CLIM OFF  ... non ?

 

Posté(e)

ToToc !

 

me REvoila avec une nouvelle question ( je conserve le Topic pour éviter de faire du Vrac ! )

 

c1.thumb.PNG.44092e3990bfad4cc670249b55f0ec89.PNG

 

 

Dans ma table Json, ( ex ci dessus :D )

j'ai des "objets" 1 - 2 - 3  jusqu'a 36 avec à chaque fois à l’intérieur du tableau :  name; type, value

malheureusement parfois le tableau passe de 36 à 38 ( en ajoutant par le haut du tableau mais pas forcement la 1er ligne)

et pour le coup quand j'utilise : 

local  Valeur3 = jsonTable.devices[2].states[3].value 

bahh quand le tableau bouge c'est pas forcement la valeur recherchée :s

 

Est-ce possible de rechercher le résultat ' value ' d'après la ligne 'name'  ? ? ?

 

Ex avec name  : io:TargetHeatingLevelState 

 

merci pour votre patience :P

 

 

 

 

Posté(e)

ce que je ferais, c'est parcourir toute la table.

Pour chaque index du tableau, on vérifie la valeur de 'name'

Si cela correspond à ce qu'on recherche, alors on sort immédiatement de la boucle (avec l'instruction "break") et on peut exploiter la 'value'

 

  • Like 1
Posté(e)

Merci @Lazer , le temps de digérer les divers tuto sur Google :P .... et de faire quelques milliers de tests .....

 

Donc étant toujours dans un http:request()  : 

 

          for k, v in pairs(jsonTable.devices[2].states) do
            
            if v.name == 'io:TargetHeatingLevelState' then
              local Heating_mode = v.value 
              fibaro:debug( '<font color="Green"> Etat du Chauffage </font><font color="yellow">  : </font><font color="red">' .. Heating_mode .. '</font>') 
           -- fibaro:setGlobal("Cozytouch_mode", Heating_mode)
            end
              
            if v.name == 'core:BoostModeDurationState' then
              local Boost_mode = v.value 
              fibaro:debug( '<font color="Green"> Etat du Boost </font><font color="yellow">  : </font><font color="red">' .. Boost_mode .. '</font>')
            --fibaro:setGlobal("Cozytouch_VersionState", Boost_mode) 
            end 
          
          end

 

ff.PNG.36274e312415b97559092b224a905e25.PNG

 

 

c'est pas trop lourd et du coup je traite que les infos utiles 

 

MErci !

 

 

:D  .... je reviendrai :P

 

 

×
×
  • Créer...