Aller au contenu

Creation Auto De Variable Avec Nom + Id Virtual Device


c-lol

Messages recommandés

Salut, 

 

suite à  la mise à  jour V4, beaucoup de galères me sont tombé dessus. J'ai dà» reinclure pleins de module, modifié mes scènes, bref ça m'a bien saoulé. :angry:

Du coup après la lecture du post du Post sur la sauvegarde des ID devices dans des variables, chose que j'ai faites mes différemment, je me suis dis " mais pourquoi pas créer automatiquement ces variables pour les virtuals devices?"

 

Du coup j'ai préparé un bout de code que vous pouvez insérer dans un des boutons d'un virtual device pour créer la variable et ensuite y'a plus qu'a appeler la variable dans les scènes.

 

Le script créé automatiquement une variable avec le nom (pb des espaces inclus) et son ID. Bien-sur c'est facilement modifiable au début du script.

 

à‡a pourra servir quand on pourra faire des plugins. Ops auto Installable. :60:

 

et ca va simplifier les autres tutos et surtout pour les fautes de casse.

--Connexion HC2
local ipAddress = "192.168.1.1";
local TCPPort = "80";
local login = "myUsername";
local password= "myPassword";

--Variable
local idDevice = tostring(fibaro:getSelfId());
local deviceName = fibaro:getName(idDevice);
local variableName = string.gsub(deviceName, " ",""); --Formatage du nom sans espace
local variableValue = idDevice;

--*****************************************************************

-- Verifier si la variable existe
local HC2 = Net.FHttp(ipAddress, TCPPort)
	HC2:setBasicAuthentication(login, password)
	response ,status, errorCode = HC2:GET("/api/globalVariables/" ..variableName);
	--fibaro:debug(status);

-- Créer la variable
if status == "404" then
  local jsonTable = {name = variableName, value = variableValue};
  payload = json.encode(jsonTable);
  --fibaro:debug(payload);
  local HC2 = Net.FHttp(ipAddress, TCPPort)
  HC2:setBasicAuthentication(login, password)
  response ,status, errorCode = HC2:POST("/api/globalVariables/", payload)
  --fibaro:debug(response);
  --fibaro:debug(status);
  --fibaro:debug(errorCode);
  
  --Verification des erreurs
  if status == "201" then
    fibaro:debug("La variable '" ..variableName.. "' valeur : '" ..variableValue.. "' a été créé avec succes.");
  else
	fibaro:debug("Une erreur s'est produite. Code erreur : " ..status);
  end
  
else
  fibaro:debug("La variable : '" ..variableName.. "' existe déjà .");
end
Lien vers le commentaire
Partager sur d’autres sites

si surement en faisant une boucle. On lit l'id du device que l'on insère comme comme variable dans la requête de création. 

Mais la je bloque sur la mise a jour avec le PUT et surtout créer des variable avec plusieurs valeur "isEnum":true, "enumValues":["val1", "val2", "val3"]

 

Si quelqu'un a des conseils.

 

@kriskroff : j'ai regardé le VD updateNotifier et d’après ce que j'ai compris du code c'est une variable simple.

Lien vers le commentaire
Partager sur d’autres sites

@c-lol,

 

En fait peut importe le type de variable et j'ai donné la solution: il faut utiliser la nouvelle API REST et donc les méthodes GET / PUT / DELETE. L'utilisation de POST doit marcher encore dans quelques cas pour des raisons de compatibilité mais cela ne correspond pas à  l’architecture REST de la nouvelle API de la V4.

 

Et si tu forces "variableName" et "variableValue" en string ;)

Lien vers le commentaire
Partager sur d’autres sites

@krikroff : merci pour ton aide, mais je ne comprends toujours pas, j'y arrive toujours pas.

 

je suis sur le site developper de fibaro et pour l'API il est indiqué 

 

 

 

Global variables

URL: /api/globalVariables

Methods: GETDELETEPOSTPUT

Description: Returns a list of global variables, their values and parameters.

Response: Gets an object containing all global variables.

 

AH!! je viens de trouver les docs API sur la HC2 et effectivement ce n'est pas indiqué POST.

D'ailleurs il y a d'autres incoherences (globalVariableID type Integer alors qu'il faut globalVariableName type string)  bref...  <_<  

 

J'ai essayé avec PUT en forcant variableName/variableValue tostring()

 

2 cas de figures

Soit je mets le nom de la variable après "/api/globalVariables"  et j'ai l'erreur suivante :

 

 

[DEBUG] 11:30:43: payload = {"name":multi,"value":135,"isEnum":true,"enumValues":["a","b","c"]}


[DEBUG] 11:30:43: response =
[DEBUG] 11:30:43: status = 404
[DEBUG] 11:30:43: errorCode = 0
 

Cette erreur me parait logique étant donné qu'on veut mettre à  jour une variable n'existant pas.

 

soit je ne la mets pas et j'ai l'erreur suivante :

 

 

[DEBUG] 11:29:41: payload = {"name":multi,"value":135,"isEnum":true,"enumValues":["a","b","c"]}


[DEBUG] 11:29:41: response = {"type":"ERROR","reason":"name","message":"No variable name in uri"}
[DEBUG] 11:29:41: status = 400
[DEBUG] 11:29:41: errorCode = 0
 

logique aussi.

 

 

En utilisant l'API directement de la HC2, si la variable n'existe pas, erreur "no content"

 

Si la variable existe, la commande passe bien mais les paramètres ne sont pas mis à  jour

 

le body 

 

{name = multi, value = "13", isEnum = true, enumValues = ["13","b","c"]}

 

la réponse

 

 

{ "name": "multi", "value": "Valeur 1", "readOnly": false, "isEnum": true, "enumValues": [ "Valeur 1", "Valeur 2" ], "created": 1421666921, "modified": 1421666921 }

 

J'ai beau retourner le problème dans tous les sens, "", pas "", [ ], pas [ ]... 

 

Apres ces test j'en conclu qu'il faut POST pour créer une variable et PUT pour la MAJ.

 

mais étant borné, il faut que je comprenne! :)

Lien vers le commentaire
Partager sur d’autres sites

Je vais peut-être dire des bêtises mais ton value:135 ne peux pas marcher pour un enum avec "a", "b", "c" :rolleyes:
 
Ton payload devrait être 

payload = {"name":"multi","value":"a","isEnum":true,"enumValues":["a","b","c"]}

Pour info la documentation active ne marche pas correctement.

 

de plus tu peux enlever le

HC2:setBasicAuthentication(login, password)

et utiliser l' IP 127.0.0.1 et le port 11111 ;)

Lien vers le commentaire
Partager sur d’autres sites

Désolé c’était un mauvais copier/coller. J'ai vérifier dans le script les valeurs étaient bien identique.

 

pour le payload copié/collé tel quel me mets une erreur 

 

 

 

[ERROR] 16:31:58: line 31: '}' expected near '
 

 

ligne 31 = la ligne du payload dans mon script

 

as tu déjà  réussi à  faire ce que je souhaite? ou alors je suis vraiment une quiche!!  :o

Lien vers le commentaire
Partager sur d’autres sites

l'id c'est de faire comme tu fais pour le updateNotifer c'est dire me générer les variables automatiquement quand je mets un VD.

J'ai bien regardé ton code et tu utilises POST et une variable simple.

--Connexion HC2
local ipAddress = "127.0.0.1";
local TCPPort = "11111";
local login = "myUsername";
local password= "myPassword";
 
--Variable
local idDevice = tostring(fibaro:getSelfId());
local deviceName = fibaro:getName(idDevice);
local variableName = "multi";
variableName = tostring(variableName);
local variableValue = "a";
variableValue = tostring(variableValue);
 
--*****************************************************************

  local payload = {"name":"multi","value":"a","isEnum":true,"enumValues":["a","b","c"]};
  
  fibaro:debug(payload);
  local HC2 = Net.FHttp(ipAddress, TCPPort);
  --HC2:setBasicAuthentication(login, password)
  response ,status, errorCode = HC2:PUT("/api/globalVariables/" ..variableName, payload);
  fibaro:debug(response);
  fibaro:debug(status);
  fibaro:debug(errorCode);
 
  --Verification des erreurs
  if status == "201" then
    fibaro:debug("La variable '" ..variableName.. "' valeur : '" ..variableValue.. "' a été créé avec succes.");
  else
	fibaro:debug("Une erreur s'est produite. Code erreur : " ..status);
  end
Lien vers le commentaire
Partager sur d’autres sites

Visiblement l' API fait du yoyo et n'accepte le PUT que sous certaines conditions et la limite semble être le virtual device lui même :rolleyes:, voici le code à  utiliser pour la création complète d' une variable de type Enum

--Variables
local varName, varValue = "multi", "a";

local HC2 = Net.FHttp("127.0.0.1", 11111);
response ,status, errorCode = HC2:POST("/api/globalVariables/"..varName, json.encode({
      name = varName,
      value = "",
      isEnum = 1,
      enumValues = {}
    })
);
--Verification des erreurs
if status == "200" or status == "201" then
  fibaro:sleep(800);
  response ,status, errorCode = HC2:PUT("/api/globalVariables/"..varName, json.encode({
        name = varName,
        value = varValue,
        isEnum = true,
        enumValues = {"a","b","c"}
      })
  );
  if status == "200" or status == "201" then
    fibaro:debug("La variable '" ..varName.. "' valeur : '" ..varValue.. "' a été créé avec succes.");
  else
    fibaro:debug("Mise à  jour - Code erreur : " ..status);
  end
else
  fibaro:debug("Création - Code erreur : " ..status);
end

Observations sur ton code (critique constructive ;) )

local variableName = "multi";
variableName = tostring(variableName);

un tostring(...) sur la valeur "multi" donc en string ne change rien et n'avance à  rien.

local payload = {"name":"multi","value":"a","isEnum":true,"enumValues":["a","b","c"]};

payload ainsi est une table LUA, tu dois obligatoirement faire un json.encode afin de préparer la chaine pour le passage au body de la requête (POST, PUT)

 

Voilou... J'espere avoir répondu a tes attentes :)

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...