Aller au contenu

Lua => Manipulation D'un Json


Messages recommandés

Posté(e)

Bonjour,

je souhaite réaliser un Virtual Device pour la gestion de mon chauffage. Pour cela je désire récupérer le json du panneau de chauffage pour ensuite le modifier et le réinjecter ...

 

Première étape le json.decode et l'essaie d'affichage du résultat dans le debug

 

 

HC2 = Net.FHttp("192.168.0.6",80)
HC2:setBasicAuthentication("toto", "toto")




response, status, errorcode = HC2:GET("/api/panels/heating/402")


local monTableau = json.decode(response)


fibaro:debug(monTableau)
J'obtiens ceci dans le debug ..
 

[ERROR] 19:22:22: line :debug (arg 2), expected 'string const &' got 'nil'
 
cela commence bien  :huh:
 
 
 

 

 

 

 

 

 

 

 

 

 

 

Posté(e)

Salut, 

 

si 402 est l'ID de ta pièce, essaye plutôt ça

HC2 = Net.FHttp("192.168.0.6",80)
HC2:setBasicAuthentication("toto", "toto")
 
 
 
 
response, status, errorcode = HC2:GET("/api/panels/heating?id=402")
 
 
local monTableau = json.decode(response)
 
 
fibaro:debug(monTableau)
Posté(e)

@lionel, en fait la syntaxe que tu m'as donné pour le HC2:GET est celui de l'ancienne API à  V4 il faut bien faire l'appel comme je l'ai indiqué.

L'erreur que j'ai indiqué montre clairement un problème de format. Le debug attend un "string" (attention pas de débordement stp  ;) ) alors que je lui renvoie surement un tableau.

 

J'ai essayé ainsi pour voir mais pas bien marche non plus

 

  1. fibaro:debug(monTableau[1])
 
 
j'ai aussi essayé avec ceci
 
local texte = table.concat(monTableau)
fibaro:debug(texte)

et je n'ai plus de message d'erreur dans le debug par contre il n'est retourné aucune valeur

[DEBUG] 20:23:14:
[DEBUG] 20:25:00:

 

 

Posté(e)

PITP2, json.decode() retourne une table. Tu ne peux pas passer une table comme ça telle quelle à  une fonction qui s'attend à  une chaîne de char comme fibaro:debug().

il va falloir que tu navigues dans la table en utilisant des index ou bien avec des boucles récursives.

 

voici un petit exemple qui reprend ton code et  'dump' le contenu de la table json. Peut toujours servir pour du debuguer du code


function table.val_to_str ( v )
  if "string" == type( v ) then
    v = string.gsub( v, "\n", "\\n" )
    if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
      return "'" .. v .. "'"
    end
    return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
  else
    return "table" == type( v ) and table.tostring( v ) or
      tostring( v )
  end
end

function table.key_to_str ( k )
  if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
    return k
  else
    return "[" .. table.val_to_str( k ) .. "]"
  end
end

function table.tostring( tbl )
  local result, done = {}, {}
  for k, v in ipairs( tbl ) do
    table.insert( result, table.val_to_str( v ) )
    done[ k ] = true
  end
  for k, v in pairs( tbl ) do
    if not done[ k ] then
      table.insert( result,
        table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
    end
  end
  return "{" .. table.concat( result, "," ) .. "}"
end

-- 
HC2 = Net.FHttp("192.168.0.6",80)
HC2:setBasicAuthentication("admin", "admin")


response, status, errorcode = HC2:GET("/api/panels/heating/402")
monTableau = json.decode(response)
fibaro:debug(table.tostring(monTableau))

Posté(e)

regardes aussi le tuto de Steven sur la gestion du chauffage avec des sondes oregon, netatmo...

http://www.domotique-fibaro.fr/index.php/topic/841-gestion-chauffage-avec-sondes-oregon-netatmo-json-etc/?view=findpost&p=11865&hl=%2Bsteven+%2Bpellet

 

son module virtuel utilise les données json du panneau de chauffage fibaro. Ca te fait déjà  la moitié du boulot si j'ai bien compris ce que tu cherches à  faire.

Posté(e)

Petit conseil

 

Dorénavant, on oublie les 

HC2 = Net.FHttp("192.168.0.6",80)
HC2:setBasicAuthentication("toto", "toto")

et on remplace par 

HC2 = Net.FHttp("127.0.0.1",11111)

Ainsi .. plus besoin d'authentification et plus besoin de traîner des mots de passe dans nos modules virtuels.

 

Pour le reste ... c'est long ... déjà  8 jours :)

 

Trêve de taquinerie, si tu as besoin d'un coup de main ... c'est toujours avec plaisir.

Posté(e)

@steven, merci pour le conseil qui était déjà  intégré dans la version de test car j'ai honteusement pompé sur ton Virtuel Device  ^_^

 

Plus c'est long ....  ;)

Posté(e)

Je peux rien garantir pour la 3.6, il faut essayé.

 

Il n'y a pas de quoi avoir honte, cela sert à  ça les échanges :)

  • 1 an après...
Posté(e) (modifié)

bonjour a tous

 

je souhaite si il y a eu un changement depuis le passage de 4.100

 

mon code ne fonctionne pas

[DEBUG] 11:30:02: line 7: attempt to index global 'Net' (a nil value)
HC2 = Net.FHttp("127.0.0.1",11111)
response = HC2:GET("/api/rooms/name?id=4")
 
 
local monTableau = json.decode(response)
 
 
fibaro:debug(monTableau)
Modifié par 971jmd
Posté(e)

j'ai chercher mai j'ai pas trouver la solution a mon probleme


 


je cherche a comprendre comment fonctionne la fonction API.


 


Sur module virtuel je commence a comprendre la chose, j'ai des resultat pas encouragent.


Mai sur scène LUA j'ai aucun résultat . :(


 


 


voici mon premier exercice,en LUA


 


interroger ID 13 et afficher dans le debug  le non du module : Name, roomID ....etc


Posté(e)

Merci @Steven :60:

 

ok pour la méthode GET

 

et je souhaite réaliser une methode PUT ?

 

 

mon idée est copier ou modifier une partie des paramètres d'un FGD212 et de les appliqué a d'autre FGD, une façon d’exporter les paramètres. 

 

surtout le FGMS

{
  "id": 192,
  "name": "Plafonnier Salon",
  "roomID": 4,
  "type": "com.fibaro.FGD212",
  "baseType": "com.fibaro.multilevelSwitch",
  "enabled": true,
  "visible": true,
  "isPlugin": false,
  "parentId": 190,
  "remoteGatewayId": 0,
  "interfaces": [
    "energy",
    "levelChange",
    "light",
    "power",
    "zwave",
    "zwaveAlarm",
    "zwaveMultiChannelAssociation",
    "zwaveProtection",
    "zwaveSceneActivation"
  ],
  "properties": {
    "parameters": [
      {
        "id": 1,
        "lastReportedValue": 12,
        "lastSetValue": 12,
        "size": 1,
        "value": 12
      },
      {
        "id": 2,
        "lastReportedValue": 81,
        "lastSetValue": 81,
        "size": 1,
        "value": 81
      },
      {
        "id": 3,
        "lastReportedValue": 1,
        "lastSetValue": 1,
        "size": 1,
        "value": 1
      },
etc.......
etc.........
Posté(e)

Je n'aime pas ce genre de traitement donc je ne te fournirais jamais un code la dessus :-)

 

Il y a pas mal d'info sur ce forum.

 

Quitte à  faire quelque chose de tordu et délicat, voici un exemple propre d'un put :

  local json = {["value"]="Coucou", ["invokeScenes"]=true}
  api.put("/globalVariables/Test", json)
  • Upvote 1
Posté(e)

je savait que tu aurai dit ça  :D

 

l'idée n'est de copier l’intégralité des paramètre mes les plus utilisé 

 

 

pour le FGD

-interrupteur à  bascule

-commutateur momentané

-Niveau de luminosité minimum
-Niveau de luminosité maximum 
-Le pourcentage d'une étape de variation (commande automatique)
-Paramètre 6Durée d'une étape de variation (commande automatique)
-Paramètre Le pourcentage d'une étape de variation (commande manuelle)
etc
etc
Posté(e)

si comprend bien le code 

 local json = {["value"]="Coucou", ["invokeScenes"]=true}
  api.put("/globalVariables/Test", json)

crée une variable Test

×
×
  • Créer...