Aller au contenu
jojo

[LUA] - mise à jour JSON d'une pièce/section

Recommended Posts

Bonjour,

Tout d'abord 100000 excuses de ne plus pouvoir offrir une aide similaire au passé ... J'ai été obligé de passer en mode "profiteur" :20:

 

Je cher en LUA à modifier l'icone d'une pièce (j'ai trouvé le nom de l'icône)

Voici le json de la pièce :

// 20230807150204
// http://<ip box>/api/rooms/239

{
  "id": 239,
  "name": "Chaufferie",
  "sectionID": 224,
  "isDefault": false,
  "visible": true,
  "icon": "User1005",
  "defaultSensors": {
    "temperature": 528,
    "humidity": 0,
    "light": 0
  },
  "meters": {
    "energy": 0
  },
  "defaultThermostat": 889,
  "created": 1691283771,
  "modified": 1691283771,
  "sortOrder": 15,
  "category": "other"
}

je souhaite changer le champ

"icon"

de "User1005" à "User1002" (par exemple).

 

Pour mettre à jour la propriété d'un device, on fait ceci

hub.call(<idDevice>, "updateProperty", "<propertyName>", <propertyValue>)

mais ici, ce n'est pas une propriété.

 

MERCI de votre aide.

Partager ce message


Lien à poster
Partager sur d’autres sites

dans un QA Essaye

 

Pour Icone User1002.png

self:updateProperty("deviceIcon", 1002)  

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ta réponse rapide,

MAIS, ce n'est pas ce que je cherche à faire (ma question n'était donc pas suffisamment claire).

Ici tu mes à jour la propriété du device en cours (self:)

 

ce que je cherche à faire, c'est mettre à jour un champ du json (dune pièce, section, ...; donc pas du device actuel (= pas self:)), et en plus ce champ n'est pas sous "properties".

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'avais pas compris ce que tu recherche 

Dans ce cas je ne sais pas, mais je ne doute pas que la réponse arrivera vite

Partager ce message


Lien à poster
Partager sur d’autres sites

Avec les outils de développeurs de ton butineur sur la toile d'araignée mondiale (en clair : touche F12), tu regardes la requête effectuée lors tu modifies l'icône via le GUI.

 

A mon avis ça va être un requête de type POST sur /api/rooms

Il faut juste utiliser les bons paramètres, comme le fait le GUI.

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

MERCI, mais c'est lourd tout ça ...

j'aurais espéré qu'il t avait une instruction sympa (que je ne connaissais pas) qui le faisait sympa style 

hub.call (<id>,"updateJson",<JsonField>,<JsonFieldValue>)


J'ai pensé qu'avec un json.decode/encode on devrait y arriver ?

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai fait F12, mais il y a 3 tonnes d'infos, où dois-jerader ? Quel onglet ?

Partager ce message


Lien à poster
Partager sur d’autres sites

je croyais avoir trouvé qqch avec F12:

Dans l'onglet Network, sur la requete qui correspond à la sélection de mon icône,

j'ai fait Copy Request Headers, et j'ai ceci

GET /assets/userIcons/rooms/User1002.png?v=1691429284495 HTTP/1.1
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr
Connection: keep-alive
Host: 192.168.x.y
Referer: http://192.168.x.y/app/settings/rooms
Sec-GPC: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36

mais ça ne correspond pas à ce que tu m'as dit, et ce n'est pas exploitable

Partager ce message


Lien à poster
Partager sur d’autres sites

Le GET c'est juste afficher l’icône.

Ensuite quand tu modifies l’icône de ta pièce et que tu sauvegardes, tu dois voir une requête POST je pense, avec des datas.

Partager ce message


Lien à poster
Partager sur d’autres sites
api.put("/rooms/239",{icon='User1002'})
  • Like 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Efficace :)

 

C'est donc une requête PUT :)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Et par curiosité, pourquoi cherches tu à modifier une icône de pièce via une requête http ?


Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

dans l'application Web, je n'enai aucune utilité, par contre dans l'appli mobile :

exple : j'ai une pièce chaufferie, et j'ai 4 modes de chauffage : Confort, SdB, ECS et vacances. L'idée est que l'icône de la pièce chaufferie corresponde au mode de chauffage choisi. Donc, je gagne un clic juste en regardant l'icône de la pièce.

Je souhaite faire la même chose pour ma pièce piscine : une icône avec volet fermé, une autre avec volet ouvert.

 

ok; c'est loins d'être indispensable, mais ça permet de se creuse les méninges ...

  • Like 3

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 18 heures, jang a dit :

api.put("/rooms/239",{icon='User1002'})

So we could use this method to update any Json field of anything ("/devices/<idDevice>") ?

Partager ce message


Lien à poster
Partager sur d’autres sites

et ça fonctionne super ! (évidemment)

et pour rendre mon code plus fluide, j'ai créé une table avec le nom des icônes

    IconesRoom = {
        Confort = "User1002",
        SdB     = "User1003",
        ECS     = "User1004",
        Off     = "User1005"
              }

mais je ne vois pas comment l'utiliser (je veux éviter des if elseif)

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est simple vu que tu connais le nom de l'index

IconesRoom["SdB"]


Envoyé de mon BLA-L29 en utilisant Tapatalk
 

Partager ce message


Lien à poster
Partager sur d’autres sites

c'est ce que j'ai fait pour l'icône de mon QA

    -- ICONES
    Icones = {
        Confort = 1007,
        SdB     = 1010,
        ECS     = 1008,
        Off     = 1009
              }

...

function QuickApp:UI_Maison_Mode(Chauf_Maison_Mode)
    -- changer l'icone du QA
    self:updateProperty("deviceIcon", Icones[Chauf_Maison_Mode])
...
end

mais ici c'est du texte qu'il faudrait concaténer, dans un argument qui n'est pas en format texte

api.put("/rooms/239",{icon="User1005"})

Une solution pourrait être de modifier mon tableau comme ceci :

    IconesRoom = {
        Confort = "{icon='User1002'}",
        SdB     = "{icon='User1003'}",
        ECS     = "{icon='User1004'}",
        Off     = "{icon='User1005'}"
              }

Mais je n'aime pas du tout, car mon tableau contiendrait plusieurs fois la même information.

Je préférerais de loin un tableau comme ceci

    IconesRoom = {
        Confort = "1002",
        SdB     = "1003",
        ECS     = "1004",
        Off     = "1005"
              }

et que mon code génère tout ce qui manque

Partager ce message


Lien à poster
Partager sur d’autres sites
-- ICONES
Icones = {
	Confort = 1007,
	SdB     = 1010,
	ECS     = 1008,
	Off     = 1009
}

function QuickApp:UI_Maison_Mode(Chauf_Maison_Mode)
	-- changer l icône de la pièce
	api.put("/rooms/239", {icon = "User"..tostring(Icones[Chauf_Maison_Mode])})

end

Il faut concaténer "User" avec le contenu de ta table.

 

Pour info le tostring() n'est pas indispensable dans ce cas présent car LUA réalise la conversion de type number => string automatiquement.

 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

si simple que ça ...

je vais du coup créer d'autres tables pour endre mes codes "plus jolis".

=> Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

et comme je n'aime pas ce qui est écrit en dur dans les code, voici comment je détermine l'id de la pièce  qui contient le QA :

    local idPiece = hub.getRoomID(plugin.mainDeviceId)
    api.put("/rooms/"..idPiece, {icon = "User"..UI[Chauf_Maison_Mode][2] })

 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 07/08/2023 à 20:16, jang a dit :

api.put("/rooms/239",{icon='User1002'})

hello @jang, you "saved my life" with this instruction.

 

Now I would like to use it to update a dedicated property of a device.

In the json for rooms, icon is on "the root" of the json.

The property "userDescription" in the device json is under "properties"

so what is the correct syntax ? Something like :

api.put("/devices/239",{properties\userDescription='MyDescription'})

(I want to use this syntax to update > 500 properties)

thank you

Partager ce message


Lien à poster
Partager sur d’autres sites

I said to myself :"Let's keep it simple and standard".

So I tried this

    hub.call(20, "updateProperty", "userDescription", "FWPP1")

And it does not work. I do not understand why ...

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 5 heures, jojo a dit :

I said to myself: "Let's keep it simple and standard".

So I tried this


And it doesn't work. I don't understand why...

This only works if the device is a QA. QuickApp's have 'updateProperty' defined as an API.

I would recommend 

api.post("/plugins/updateProperty", { deviceId = 20, propertyName = 'userDescription', value = 'FWPP1' })

 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

thank you !

it does (of course) works !

This is EXACTLY what I needed.

Partager ce message


Lien à poster
Partager sur d’autres sites

×