c-lol Posté(e) le 13 janvier 2015 Signaler Posté(e) le 13 janvier 2015 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é. 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. 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
Krikroff Posté(e) le 13 janvier 2015 Signaler Posté(e) le 13 janvier 2015 C'est ce que j'utilise dans l'updateNotifier
c-lol Posté(e) le 13 janvier 2015 Auteur Signaler Posté(e) le 13 janvier 2015 Arf!! Si j'avais su j'aurais installer le device. Mais comme tu annonces sur le post que tu release une nouvelle version, je vais attendre!! 1
Indyana Posté(e) le 14 janvier 2015 Signaler Posté(e) le 14 janvier 2015 En partant de ce principe et avec l' /api/devices n'est t'il pas possible de créer/mettre àjour l'ensemble des ID pour la totalité des devices?
c-lol Posté(e) le 15 janvier 2015 Auteur Signaler Posté(e) le 15 janvier 2015 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.
Krikroff Posté(e) le 15 janvier 2015 Signaler Posté(e) le 15 janvier 2015 @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
c-lol Posté(e) le 19 janvier 2015 Auteur Signaler Posté(e) le 19 janvier 2015 @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 variablesURL: /api/globalVariables Methods: GET, DELETE, POST, PUT 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!
Krikroff Posté(e) le 19 janvier 2015 Signaler Posté(e) le 19 janvier 2015 Je vais peut-être dire des bêtises mais ton value:135 ne peux pas marcher pour un enum avec "a", "b", "c" 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
c-lol Posté(e) le 19 janvier 2015 Auteur Signaler Posté(e) le 19 janvier 2015 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!!
Krikroff Posté(e) le 19 janvier 2015 Signaler Posté(e) le 19 janvier 2015 Mais tu souhaites faire quoi exactement ? Tu peux poster ton code qui ne marche pas ? Envoyé de mon smartphone
c-lol Posté(e) le 19 janvier 2015 Auteur Signaler Posté(e) le 19 janvier 2015 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
Krikroff Posté(e) le 19 janvier 2015 Signaler Posté(e) le 19 janvier 2015 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 , 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 1
c-lol Posté(e) le 23 janvier 2015 Auteur Signaler Posté(e) le 23 janvier 2015 merci krikroff!! Je vais checker ça dans le WE et je te tiens au courant!!
Messages recommandés