Aller au contenu

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


Messages recommandés

Posté(e)

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.

Posté(e)

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".

 

Posté(e)

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
Posté(e)

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 ?

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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
Posté(e)
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>") ?

Posté(e)

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)

Posté(e)

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

Posté(e)
-- 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
Posté(e)

si simple que ça ...

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

=> Merci

Posté(e)

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
  • 7 mois après...
Posté(e)
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

Posté(e)

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 ...

Posté(e)
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
×
×
  • Créer...