Lua et json

json_luaLes dernières versions de Domoticz donnent maintenant la possibilité de lire/fabriquer, dans nos scripts Lua, des fichiers au format JSON en natif sans autre outil externe.

L’intérêt est grand en effet d’avoir des outils pour exploiter ce format qui est utilisé nativement dans Domoticz, mais aussi dans de nombreux sites web afin de donner aux utilisateurs des possibilités d’interrogation, citons juste l’api de Domogeek, celle de méteo France, airaprif …..

Rappel pour ceux qui arriveraient maintenant https://easydomoticz.com/lapi-json-de-domoticz-demythifiee/ et la bibliothèque complète https://easydomoticz.com/traduction-francais-de-lapi-json-domoticz/

Encore une fois il s’agit de la traduction de la page correspondante du wiki https://www.domoticz.com/wiki/Lua_-_json.lua

Utilisation

Rien n’est à installer puisque les versions après le 23/11/2016 (build  8e0dfd5) incorporent un fichier JSON.lua dont nous allons voir l’utilisation ici.

Dans chaque script Lua qui aura besoin d’utiliser des valeurs renvoyées au format JSON, il nous suffira d’appeler ce fichier JSON.lua. Ce fichier est dans le répertoire des scripts lua que ce soit sous Linux ou Windows©.

Exemples

Domoticz

Imaginons que je cherche à récupérer dans un script Lua, le nom et la valeur actuelle d’un dispositif interne à Domoticz.

Comme en tapant dans un navigateur :

http://192.168.1.81:8080/json.htm?type=devices&ridx=226 ou le ridx=226 est l’idx de mon périphérique Domoticz et 192.168.1.81:8080 , l’IP et le port de mon Domoticz.

je reçois cela en retour

{
"ActTime" : 1482786662,
"ServerTime" : "2016-12-26 22:11:02",
"Sunrise" : "08:37",
"Sunset" : "17:25",
"result" : [
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 0,
"Data" : "On",
"Description" : "",
"Favorite" : 1,
"HardwareID" : 3,
"HardwareName" : "Rfxcommusb10",
"HardwareType" : "RFXCOM - RFXtrx433 USB 433.92MHz Transceiver",
"HardwareTypeVal" : 1,
"HaveDimmer" : true,
"HaveGroupCmd" : true,
"HaveTimeout" : false,
"ID" : "0945F16",
"Image" : "Light",
"IsSubDevice" : false,
"LastUpdate" : "2016-11-03 07:48:25",
"Level" : 0,
"LevelInt" : 0,
"MaxDimLevel" : 15,
"Name" : "Volet Salon",
"Notifications" : "false",
"PlanID" : "4",
"PlanIDs" : [ 4, 9 ],
"Protected" : false,
"ShowNotifications" : true,
"SignalLevel" : "-",
"Status" : "On",
"StrParam1" : "",
"StrParam2" : "",
"SubType" : "AC",
"SwitchType" : "On/Off",
"SwitchTypeVal" : 0,
"Timers" : "false",
"Type" : "Lighting 2",
"TypeImg" : "lightbulb",
"Unit" : 5,
"Used" : 1,
"UsedByCamera" : false,
"XOffset" : "899",
"YOffset" : "507",
"idx" : "34"
},
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,

Je vois que le nom est dans Name et la valeur dans Data ET TOUT CA dans le « pavé » nommé ‘result’

"result" : [
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 0,
"Data" : "On",
...
"Name" :"Volet Salon",

Le script utilisant la bibliothèque JSON.lua serait :

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
--   json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")()  -- For Windows

local config=assert(io.popen('/usr/bin/curl http://192.168.1.81:8080/json.htm?type=devices&rid=226'))

 local blocjson = config:read('*all')
 config:close()
 --print (blocjson)
 local jsonValeur = json:decode(blocjson)
 nom = jsonValeur.result[1].Name
 data = jsonValeur.result[1].Data

 print('****************')
 print(nom)
 print(data)
  

commandArray = {}
print('****************')
return commandArray

  • on incorpore le fichier JSON.lua
  • on appelle curl pour interroger le site web qui nous renverra ses données JSON  (ici mon Domoticz)
  • la variable ‘blocjson’ contient tout le pavé JSON, (enlevez les — devant pour voir ce que vous avez reçu)
  • puis l’appel de result[1].Name, result[1].Data nous permet d’assigner nos variables.

Oui, mais pourquoi result[1] ? , cette syntaxe correspond au fait qu’il s’agit du 1er « pavé » nommé ‘result’  dans mon JSON (même si l’y en a qu’un seul).

Weather Undergroud

La doc du wiki prend en exemple le site Weather Ungerground

On voit dans la documentation qu’il nous renvoie la météo sous cette forme JSON

{
  "response": {
  "version": "0.1",
  "termsofService": "http://www.wunderground.com/weather/api/d/terms.html",
  "features": {
  "conditions": 1
  }
  },
  "current_observation": {
  "image": {
  "url": "http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png",
  "title": "Weather Underground",
  "link": "http://www.wunderground.com"
  },
  "display_location": {
"full": "San Francisco, CA",
  "city": "San Francisco",
  "
  "country_iso3166": "US",
  "zip": "94101",
  "latitude": "37.77500916",
  "longitude": "-122.41825867",
  "elevation": "47.00000000"
  },

Le script du wiki retire longitude et latitude par un

latitude = jsonLocation.current_observation.display_location.latitude
longitude = jsonLocation.current_observation.display_location.longitude

car je dois aller à current_observation puis display_location pour « tomber sur » latitude et longitude, faites bien attention aux {} d’imbrication et au crochets.

Ça marche pas

Si votre script Lua ne vous renvoie rien :

  • vérifiez les noms des champs dans le JSON, attention aux majuscules/minuscules.
  • avez vous bien respecté le chemin vers votre valeur wwww. xxxx.yyyyy.zzzz
  • si comme pour Domoticz le champ que vous voulez extraire est dans un truc à crochets et accolades ->
"xxxxx" : [
      {
       "mon_champ" : 1.0,

il faut utiliser xxxxx[1].mon_champ pour extraire la valeur correspondante.

Conclusion

Loin d’avoir exploré tous les cas de figures d’utilisation de cette nouveauté de Domoticz, l’intérêt apporté est grand et nous permet encore plus d’ouverture et toujours plus de puissance dans notre box domotique préférée.

Résultat de recherche d'images pour "youpi"

 J’adore ces images des années 70

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/
Posted in domoticz, domotique, scripts.