Aller au contenu

Utilisation des fichiers dans les QA


Messages recommandés

Posté(e) (modifié)

 

Voici un petit tuto sur la gestion des fichiers dans les QA.

 

petite nouveauté depuis la version 5.040.37 - 23/07/2020

 

Le code utilisé provient de @jgab sur le fofo officiel : https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/?do=findComment&comment=211496

(lien cité par @Lazer dans le topic dédié à la mise à jour : https://www.domotique-fibaro.fr/topic/14477-hc3-504037-23072020/)

 

Donc le principe de ces fichiers est de partager des fonctions d'un QA à un autre.

 

On pouvait déjà appeler une fonction d'un QA x depuis une scène ou un autre QA avec :

fibaro:call(id_QA, "MaFonction")

Mais maintenant on peut exploiter le retour de la fonction, ce qui super intéressant.

On peut donc se créer une vrai bibliothèque de fonctions

 

Voici un exemple concret : 

 

  1. le QA "source"
  2. le QA "utilisateur"
  3. l'appel d'une fonction
  4. la modification du fonction
  5. Remarques

 

1. Le QA "source" :

 

En cliquant sur l'icone "File" tout à gauche, une liste de fichier apparaît.

En cliquant sur le bouton "+", on ajoute un nouveau fichier, ici "newFile".

 

image.png.dcba450c72751098e0cdda7dbd37d8ec.png

 

La navigation se fait facilement d'un fichier à un autre via des onglets :

On a la possibilité de supprimer ou renommer un fichier.

 

image.png.21b43c79d20ce4b1460b0177611db2a7.png

 

Dans mon exemple : 

 

voici le contenu du fichier Main :

 

au passage, ce fichier ne peut pas être supprimer

donc en fait, il y a rien de particulier pour lui...

 

image.thumb.png.73231ebd0e98f037825991e03d3424a2.png

 

voici le contenu du fichier "newFile" que j'ai renommé "ToolBox" :

 

on y voit 2 fonctions :

  • StringToTimeStamp()
  • Split()

 

image.png.b72a31ced9ccd21635fb6ba9af254c83.png

 

2. le QA "utilisateur"

 

Dans un nouveau QA, j'ai inséré cette fonction : 

 

merci à @jagb du fofo officiel.

 

function QuickApp:copyFile(deviceId,fileName)
    local copyFile = api.get(string.format("/quickApp/%s/files/%s", deviceId, fileName))
    assert(copyFile,"File doesn't exists")
    local myFile = api.get(string.format("/quickApp/%s/files/%s", self.id, fileName))

    if not myFile then  --création du fichier
        local stat,res = api.post(string.format("/quickApp/%s/files", self.id), {name=fileName, type="lua", isMain=false, isOpen=false, content=copyFile.content})
        if res == 200 then self:debug("File '",fileName,"' added") else self:error("Error:",res) end

    elseif myFile.content ~= copyFile.content then  --mise à jour si existant
        local stat,res = api.put(string.format("/quickApp/%s/files/%s", self.id, fileName), {name=fileName, type="lua", isMain=false, isOpen=false, content=copyFile.content})
        if res == 200 then self:debug("File '",fileName,"' updated") else self:error("Error:",res) end  

    else --rien à changer
        self:debug("File '",fileName,"' not changed")
    end
end

et dans le code onInit() de ce QA : 

 

j'appelle cette fonction avec comme argument l'ID du QA précédent, et comme nom, le fichier créé dans ce QA précédent :

function QuickApp:onInit()
    self:debug("onInit")
    self:copyFile(494,"ToolBox")
end

après un petit refresh de la page

 

on voit que le fichier ToolBox a été ajouté :)

Mais faut faire gaffe, ça saute pas au yeux, mais je suis bien dans le nouveau QA que je viens de créer et non dans le QA précédent !

 

image.png.c17195e0a4466f1ae9aa472309f0bc16.png

 

et on peut accéder à son code en cliquant dessus !

MAIS ATTENTION A NE PAS MODIFIER LE CODE ICI ! sinon la modif ne sera pas répercutée sur le QA "source" !

 

image.png.02353cb876c375b46c53e9aaeabc1e46.png

 

 

3. pour faire appel à une fonction de ce fichier intégré

 

rien de plus simple

print(self:StringToTimeStamp("25/07/2020 16:00:00"))

réponse :

[25.07.2020] [16:17:37] [DEBUG] [QUICKAPP618]: 1595685600

 

4. En cas de modification du fichier "source" :

 

encore une fois, rien de plus simple

 

on modifie le fichier source.

on relance le QA qui intègre ce fichier source.

(penser à faire des refresh du navigateur sinon on ne voit pas la modification)

et le code est mise à jour.

 

5. Remarques :

 

  • Il est possible bien-sûr d'intégrer le même fichier dans plusieurs QA, et la modification sera évidemment répercutée sur tous les QA...
  • Visiblement dès qu'on change de fichier dans les onglets, ça relance le QA...

Donc attention lors du développement, vu que les QA se relancent automatiquement en cas d'erreurs, ça peut vite tourner en boucle...

  • Le code de la fonction "copyFile" est très clair, mais lors des mises à jour, il affiche toujours dans le debug "not changed".

Alors qu'en réalité, il y a bien eu une modification !! :15:

  • Impossible de trouver dans l'API, les infos sur ce "fichier" intégrer au QA.

Normalement, on devrait y trouver une propriété "files" avec le code, mais je trouve pas...

 

Modifié par jjacques68
  • Like 5
Posté(e) (modifié)

alors je me suis rendu compte qu'il faisait une simple copie du code du fichier dans le QA...

en affichant le "content" du file.

 

du coup, ça risque d'alourdir la taille des QA... ? voir leur réactivité ??

 

il va falloir optimiser les "fichier", en créer plusieurs pour regrouper les fonctions (traitement de chaines, opérations sur nombres, etc...)

On aura jamais besoin de tout en même temps...

Modifié par jjacques68
  • 2 mois après...
×
×
  • Créer...