Aller au contenu

Enregistrer Un Json


jojo

Recommended Posts

Bonsoir,

Je cherche à  modifier l'icône d'un device standard. (PAS d'un virtual device)

 

J'y arrive en v3.600.

Mais pas en v4.x. Hors je souhaite partager, et il faut qu'il soit utile à  plus que Lazer, Did , Sebcbien et moi  :lol:

 

Je modifie la propriété deviceIcon. Mais comment (en v4.x) enregistrer le json modifié ?

 

Voici le code

----------------------------------
-- User Settings
----------------------------------
local DeviceID = 340
local IconeID = 1027
----------------------------------
-- DO not change bellow this line
----------------------------------
HC2 = Net.FHttp("127.0.0.1",11111)

-- détermination de la version du firmware
version = ""
payload = "/api/settings/info"
response, status, errorCode = HC2:GET(payload)
if tonumber(status) == 200 
  then
	jsonTable = json.decode(response)
	if tonumber(jsonTable.softVersion) >= 4 
      then
		version = "4.x"
     else
		version = "3.x"
	end
  else
    fibaro:log("--- ERROR ---")
	fibaro:debug('<span style="color:red;">status='..status..', errorCode='..errorCode..', payload='..payload..', response='..response..'</span>')
end
fibaro:debug('version = ' ..version)


-- modification de l'icone
if version == "3.x"
  then
    -- récupération du nom du device
    payload = "/api/devices?id=" ..DeviceID
    response, status, errorCode = HC2:GET(payload)
    jsonTable = json.decode(response)
    NameDev = jsonTable.name
    IconeDev = IconeID
    -- préparation du nouveau json
    NouvelleIcone = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"deviceIcon":"' ..IconeDev.. '"}}')
    -- écriture du nouveau json
    HC2:PUT(payload, NouvelleIcone)
  else
    -- récupération du json du device
    payload = "/api/devices/" ..DeviceID
    response, status, errorCode = HC2:GET(payload)
    jsonTable = json.decode(response)
    fibaro:debug(jsonTable.id.. " - " ..jsonTable.name.. " - " ..jsonTable.properties.deviceIcon)
    jsonTable.properties.deviceIcon = tostring(IconeID)
    fibaro:debug(jsonTable.properties.deviceIcon)
    -- préparation du nouveau json
    NouvelleIcone = json.encode(jsonTable)
    -- écriture du nouveau json
    HC2:PUT(payload, NouvelleIcone)
end

A gagner : son nom cité dans le tuto que je ferai pour partager  :2:

Lien vers le commentaire
Partager sur d’autres sites

Tu oublies Fredric aussi :D

 

Comme je te disais en MP, je viens de voir que le NouvelleIcone = json.encode(jsonTable) classe tous les champs par ordre alphabétique. Je ne sais pas si c'est ça le pb, mais le résultat du PUT est un code HTTP 500, donc pas bon :(

Lien vers le commentaire
Partager sur d’autres sites

J'ai essayé depuis l'API de faire un GET , puis de copier coller le résultat dans le PUT de l'api bilan des courses

je peux faire des modifs du nom du device par exemple mais je ne peux pas modifier les properties

même chose que Lazer  HTTP 500

 

Why ????

Lien vers le commentaire
Partager sur d’autres sites

merci àtous les deux de vos réponses.

J'ai essayé le code ci-dessous, qui me donne un debug sympa (Status = 200 après un PUT) (si PORT , Status = 501)

mais je ne vois pas mon icone qui change (malheureusement je n'ai pas de module sur 220V en test). Celàfonctionnerait chez vous ?

----------------------------------
-- User Settings
----------------------------------
local DeviceID = 126
local IconeID = 1002

----------------------------------
-- DO not change bellow this line
----------------------------------
HC2 = Net.FHttp("127.0.0.1",11111)

-- détermination de la version du firmware
version = ""
payload = "/api/settings/info"
response, status, errorCode = HC2:GET(payload)
if tonumber(status) == 200 
  then
	jsonTable = json.decode(response)
	if tonumber(jsonTable.softVersion) >= 4 
      then
		version = "4.x"
     else
		version = "3.x"
	end
  else
    fibaro:log("--- ERROR ---")
	fibaro:debug('<span style="color:red;">status='..status..', errorCode='..errorCode..', payload='..payload..', response='..response..'</span>')
end
fibaro:debug('version = ' ..version)


-- modification de l'icone
if version == "3.x"
  then
    -- récupération du nom du device
    payload = "/api/devices?id=" ..DeviceID
    response, status, errorCode = HC2:GET(payload)
    jsonTable = json.decode(response)
    NameDev = jsonTable.name
    IconeDev = IconeID
    -- préparation du nouveau json
    NouvelleIcone = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"deviceIcon":"' ..IconeDev.. '"}}')
    -- écriture du nouveau json
    HC2:PUT(payload, NouvelleIcone)
  else
    -- récupération du json du device
    payload = "/api/devices/" ..DeviceID
    response, status, errorCode = HC2:GET(payload)
    jsonTable = json.decode(response)
    fibaro:debug(jsonTable.id.. " - " ..jsonTable.name.. " - " ..jsonTable.properties.deviceIcon)
    jsonTable.properties.deviceIcon = tostring(IconeID)
    fibaro:debug(jsonTable.properties.deviceIcon)
    -- préparation du nouveau json
    NameDev = jsonTable.name
    NouvelleIcone = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"deviceIcon":"' ..tostring(IconeDev).. '"}}')
    -- écriture du nouveau json
    response, status, errorCode = HC2:PUT(payload, NouvelleIcone)
    fibaro:debug("Status = " ..status.. " - Error = " ..errorCode)
end
[DEBUG] 12:46:08: version = 4.x
[DEBUG] 12:46:08: 126 - Nest Temperature - 30
[DEBUG] 12:46:08: 1002
[DEBUG] 12:46:08: Status = 200 - Error = 0
Lien vers le commentaire
Partager sur d’autres sites

@PITP2 : Merci et zut !

 

On dirait que c'est un bug. Je propose d'attendre le prochain update pour retester, j'ai épuisé toutes mes idées

Lien vers le commentaire
Partager sur d’autres sites

si cela peut aider voici le schéma de l'api

 Icons {
device (array[Device], optional),
room (array[Room], optional),
scene (array[Scene], optional)
}
Device {
id (integer, optional),
deviceType (string, optional),
iconSetName (string, optional)
}
Room {
id (integer, optional),
iconName (string, optional)
}
Scene {
id (integer, optional),
iconName (string, optional)
} 


{
  "device": [
    {
      "id": 0,
      "deviceType": "",
      "iconSetName": ""
    }
  ],
  "room": [
    {
      "id": 0,
      "iconName": ""
    }
  ],
  "scene": [
    {
      "id": 0,
      "iconName": ""
    }
  ]
}

Lien vers le commentaire
Partager sur d’autres sites

merci @mprinfo d'avoir également regardé.

La liste des gens à  citer augmente  :)  :)

 

Ceci dit, je peu faire des PUT en 3.600, alors pourquoi pas en 4.x ?

Par ailleurs, je ne comprends pas bien ce que tu m'explique avec le schéma des API.

Je te mets ici le json d'un device en 4.x

{
id: 107,
name: "104.2",
roomID: 48,
type: "com.fibaro.temperatureSensor",
baseType: "com.fibaro.multilevelSensor",
enabled: true,
visible: true,
isPlugin: false,
parentId: 104,
remoteGatewayId: 0,
interfaces: [
"battery",
"zwave",
"zwaveWakeup"
],
properties: {
parameters: [],
associationSet: [],
associationView: [],
zwaveCompany: "Fibargroup",
zwaveInfo: "3,3,67",
zwaveVersion: "25.25",
wakeUpTime: 4000,
pollingTimeSec: 0,
batteryLevel: "78",
batteryLowNotification: "true",
configured: "true",
dead: "false",
defInterval: "0",
deviceControlType: "0",
deviceIcon: "30",
emailNotificationID: "0",
emailNotificationType: "0",
endPointId: "2",
interval: "0",
liliOffCommand: "",
liliOnCommand: "",
log: "",
logTemp: "",
manufacturer: "",
markAsDead: "true",
maxInterval: "0",
minInterval: "0",
model: "",

merci @PITP2 pour ton post  :60:

Lien vers le commentaire
Partager sur d’autres sites

Donc après avoir conversé avec le support qui m'a indiqué que ce n'était pas un bug et qui m'a donné un code très très simple, j'ai joué aux 7 différences ...

 

 

voici le code qui marche (ce n'est que la partie pour la V4)

-- récupération du json du device
    payload = "/api/devices/" ..DeviceID
    response, status, errorCode = HC2:GET(payload)
    jsonTable = json.decode(response)
    fibaro:debug(jsonTable.id.. " - " ..jsonTable.name.. " - " ..jsonTable.properties.deviceIcon)
    jsonTable.properties.deviceIcon = tostring(IconeID)
    fibaro:debug(jsonTable.properties.deviceIcon)
    -- préparation du nouveau json
    NameDev = jsonTable.name
    NouvelleIcone = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"deviceIcon":'..IconeID..'}}')
    -- écriture du nouveau json
    response, status, errorCode = HC2:PUT(payload, NouvelleIcone)
    fibaro:debug("Status = " ..status.. " - Error = " ..errorCode)

Explication

Dans cette partie (cf ton code original) il y avait des "" en trop mais aussi ce qui a compliqué la recherche c'est ton utilisation de la varibale IconeDev qui n'est pas déclarée dans le "Else" et il n'apprécie pas.

De même c'est un petit peu capilotracté de passer de IconeId à  IconeDev

 

NouvelleIcone = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"deviceIcon":"' ..tostring(IconeDev).. '"}}')

 

 

J'ai fait une version plus légère enfin à  mon sens qui fonctionne bien aussi. Il ne modifie que la partie icone vu que c'est uniquement cela que l'on désire modifier.

 

 payload = "/api/devices/" ..DeviceID
    -- préparation du nouveau json
    NouvelleIcone = '{"properties":{"deviceIcon":'..IconeID..'"}}'
    -- écriture du nouveau json
    HC2:PUT(payload, NouvelleIcone)

Voila j'ai gagné ???  :)

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

@PITP2,

  1. j'adore "capilotracté"  :60:  :60:  :60: 
  2. merci de m'avoir ainsi aidé, j'ai vraiment honte de cette faute de typo (IdconeID - InconeDev et les ")

Merci pour le code simplifié. Génial qu'il fonctionne pour v4.x, mais (pour ceux qui aiment faire avancer la science), ce n'est pas suffisant en 3.600 (il veut l'id et le name en plus)

 

Maintenant je suis obligé de faire un tuto pour diffuser ce VD...

 

Et tu as gagné HAUT la main le concours.

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

  • 9 months later...

Hello,

 

Petite question, si je désire mettre à  jour un paramètre de type boolean d'un device, est-ce que l'un d'entre vous sait m'indiquer comment procéder ?

Je sèche sur la ligne suivante :

nouvelleValeur = true;
NouveauParametre = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"alarmExclude":'..nouvelleValeur..'}}')

Merci

Lien vers le commentaire
Partager sur d’autres sites

J'ai pas du capter ta réponse ou alors oui j'ai regardé mais c'est plus le formatage de la requête où je vois pas quoi mettre.

Pour tout autre type de paramètre string je m'en sors mais pour envoyer un booléen je sèche.

Lien vers le commentaire
Partager sur d’autres sites

tout f(zbord, tu dois terminer par un PUT :

function HeatPanel(id,HandTmp)
  jsonpanel = HC2:GET(GETheating ..id)
  jsontable = json.decode(jsonpanel)
  handTimestamp = jsontable.properties.handTimestamp
  handTemperature = jsontable.properties.handTemperature
  name = jsontable.name
  NouveauPanel = ('{"id":' ..id.. ',"name":"'..name.. '","properties":{"handTemperature":' ..handTemperature.. ',"handTimestamp": ' ..handTimestamp.. ',"vacationTemperature":' ..HandTmp.. '}}')
  HC2:PUT(GETheating ..id, NouveauPanel)
end

ensuite j'essayerais ceci :

nouvelleValeur = 1
NouveauParametre = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"alarmExclude":"'..nouvelleValeur..'"}}')

ou

nouvelleValeur = "1"
NouveauParametre = ('{"id":' ..DeviceID.. ',"name":"' ..NameDev.. '","properties":{"alarmExclude":"'..nouvelleValeur..'"}}')

sans garantie

Lien vers le commentaire
Partager sur d’autres sites

  • 11 months later...

salut a tous

 

je revient sur une action que je n'arrive pas a faire fonctionnée 

 

je cherche a passée : localProtectionState de 0 à 2 dans par une VD

 

 

pour info c'est la propriété d'un FGRM 222

localProtectionState = 2 permet de désactiver les bouton poussoir des volets roulant

 

 

 deviceID=542
 
local json = '{"id":'..deviceID..',"properties":{"localProtectionState": "2"}}'; -- valeurs à changer dans parametres
local HC2 = Net.FHttp("127.0.0.1", 11111)
HC2:setBasicAuthentication("xxxx@gmail.com", "xxxxxx")
local response, status, errorCode = HC2:PUT("/api/devices/"..deviceID, json)
if tonumber(status) == 200 then
fibaro:debug("Security locked")
else
fibaro:debug("err ID: "..deviceID.. " status: "..status)
end

 

 

Modifié par 971jmd
Lien vers le commentaire
Partager sur d’autres sites

Bonsoir @971jmd

 

Essaie cela

 

local deviceID=542
local json = api.get("/devices/" ..deviceID)
json.properties.localProtectionState = 2
api.put("/devices/" ..deviceID, json)

 

Modifié par pepite
Lien vers le commentaire
Partager sur d’autres sites

salut a tous 

j'ai vraiment besoins d'aide sur ce truc 

 

j'ai bien avancée, mai le probleme est le suivant:

 

quand je  lance la scène suivant,  le paramètre (localProtectionState) passe bien a 2, donc la mise OK

mai il manque une chose, pour validée la mise a jours, il faut que je me rendre dans les paramètre avancée du module et cliqué sur la disquette 

 

donc il manque quel que chose dans ce code pour vraiment metre a jour le module, comme pour enregistrée le nouveau JSON

 

local id = 547 -- ID du FGRM à  modifier
 
function Update()
  local httpClient = net.HTTPClient();
  httpClient:request('http://127.0.0.1:11111/api/devices/' .. id, {
      success = function(response)
        if tonumber(response.status) == 200 or tonumber(response.status) == 202 then
          print("Updated at " .. os.date());
        else
          print("Error " .. response.status)
        end
      end,
      error = function(err)
        print('error = ' .. err)
      end,
      options = {
        method = 'PUT',
        headers = {
          ["content-type"] = 'application/x-www-form-urlencoded;'
        },
data = "{\"id\":" .. id .. ",\"properties\":{\"localProtectionState\":2\"}}"
    }

 
    });
end
 
Update()

 

Modifié par 971jmd
Lien vers le commentaire
Partager sur d’autres sites

Il y a 19 heures, pepite a dit :

Salut, 

 

Le code que je t'ai proposé fait la même chose en 4 lignes ;-) 

oui le ton code fonctionne bien mai j'ai toujours le meme probleme 

 

le code suivant active la protection

 

local deviceID=547
local json = api.get("/devices/" ..deviceID)
json.properties.localProtectionState = 2
api.put("/devices/" ..deviceID, json)

 

protec1.JPG.9e231932ea343356e059a662df135d9b.JPG

 

 

local deviceID=547
local json = api.get("/devices/" ..deviceID)
json.properties.localProtectionState = 0
api.put("/devices/" ..deviceID, json)

 

protec0.JPG.69f63ec573bd9a69102f2be07dca6d4d.JPG

 

Pour validité complètement la mise a jour, je suis obligée de d'aller dans les paramètre du FGRM et cliquer sur la disquette 

Modifié par 971jmd
Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...
×
×
  • Créer...