Aller au contenu
mlebech

Contrôle API HC2 via Virtual Device

Recommended Posts

Bonjour,

 

je suis entrain de mettre en place le contrôle des modes vacances de ma HC2 par un VD sur les panels de chauffage. J'ai des comportements bizarres avec le VD qui me crée d'autres panneaux de chauffage à chaque fois que j'active le VD sans modifier les consignes de base. Avez-vous une idée sur le bug de mon code:

 

image.png.065710bb9f3f8705bf5c329c801f77fd.png

 

local Room_ID={}
Room_ID=json.decode(fibaro:getGlobalValue("Room_ID"))

for k,v in ipairs(Room_ID[1]) do
      fibaro:debug(Room_ID[3][k])
  if tonumber(Room_ID[2][k]) == 1 then
    HC2 = Net.FHttp("192.168.1.10",80)
    HC2:setBasicAuthentication("xxxx", "xxxx")
    response ,status, errorCode = HC2:GET("/api/panels/heating?id="..Room_ID[3][k])
    dataTable=json.decode(response)
    dataTable.properties.vacationTemperature=15
    data = json.encode(dataTable)
    HC2:PUT("/api/panels/heating?id="..Room_ID[3][k],data)
  end
end

 

* room ID correspond à heating panel ID, désolé je ne suis pas un pro...

 

image.thumb.png.961a78337d08b50d8a052da4e8da93c4.png

 

Merci d'avance pour votre aide,

 

Maxime

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Tu veux tous tes IDs de panneau dans une variable globale ?

 

Sinon tu peux le faire en plus rapide :

 

local Panel = api.get("/panels/heating/iddupanneaudechauffage")
Panel.properties.vacationTemperature = 15
api.put("/panels/heating/iddupanneaudechauffage", Panel)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai 2 logements dans ma maison donc 2 groupes de pièces à gérer séparément (gérer dans la var glob Room_ID). Par contre, je ne comprends pas ton code, à quoi correspond ton 'iddupanneaudechauffage' directement l'ID, il faut bien une recherche par ID de ce type : heating?id="..Id? De plus, il faut bien décoder et recoder en Json pour pouvoir communiquer avec la HC2 et lui envoyer des requêtes?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Ce sera plus clair comme ceci :

 

local Panel = api.get("/panels/heating/4")
Panel.properties.vacationTemperature = 15
api.put("/panels/heating/4", Panel)

Effectivement, tu as raison pour le decodage/encodage, ce sont les fonctions "api.get" et "api.put" qui s'en occupent, ce sont des fonctions internes à nos box.

 

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
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
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
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est cool, ça fonctionne par contre je n'ai pas l’habitude des raccourcis directs de l'api sans authentification ...

 

Merci,

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 7 minutes, mlebech a dit :

l'api sans authentification

regarde bien la fonction, ce n'est pas sans authentification à proprement parlé, quand tu passes par le localhost port 11111.

 

C'est géré par la fonction mais pour toi 3 lignes ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Par ailleurs je te déconseille l'ancienne méthode via l'authentification, car avec les nouvelles règles de sécurité mises en place par Fibaro (et c'est tant mieux), cela peut amener à recevoir des emails d'avertissement d'un trop grand nombre de connexions, voire une désactivation du compte.

 

En plus, en terme de sécurité, c'est mauvais, car tu stockes un mot de passe en clair dans le code LUA.

 

Donc utilise la méthode donnée par Pepite, c'est le mieux à faire :)

Partager ce message


Lien à poster
Partager sur d’autres sites

×