Aller au contenu
yves.guern

Outil pour icones, Backup et manipulation par QA

Recommended Posts

Bonjour à tous,

J'espère poster ce sujet au bon endroit et qu’il est ‘original’...

Je suis sur le point de finaliser une migration de HC2 vers HC3 pour laquelle je me suis fait quelques outils sous Windows (et pas linux: Je n'assume pas 100% mon côté geek, tout en étant l'heureux propriétaire d'un Synology...). Pour commencer je vous partage le dernier né de ces outils.

Depuis 8 années je viens prendre de bonnes idées sur ce site. Site tellement vaste qu’au bout d’un moment on se dit que : « si on n’a pas la réponse à la question ‘konseupoz,’ c’est qu’on n’a pas su bien la poser » (mais, objectivement, yadéfoi où le moteur de recherche du site n’aide pas…).

 

Bref ! Je vais essayer de passer de ‘profiteur’ à ‘contributeur’ en partageant un de mes outils de développement / transfert en espérant qu’il n’existe pas déjà ailleurs et  souhaitant qu’il rende directement service ou qu’il donne des idées.

Au départ, j ’ai plein de QA, et j’aime bien que leurs icones en reflètent l’état. Le carton entre-ouvert avec un point d’interrogation ne me suffit généralement pas :), il me rappelle trop les livraisons ‘uber-style’ jetées par-dessus la clôture.
Ajoutez à cela les multilevelSwitch qui demandent 11 fichiers png chacun à chaque modification/bug. Au moins en cours de développement, vous avez dû ‘souffrir’ autant que moi de devoir recharger les icones ’chéris’ de vos QA/devices. A chaque fois, on hésite à faire des retours en arrière pour lesquels il faudra redésigner 1 par 1 les icones au travers de l’interface HC3 et, du coup, devoir modifier le code des QA juste pour quelque IDs qui ont été modifiées…

 

Donc, en lien, je vous propose un code/script Python qui permet :

  1. Une sauvegarde/scan de toutes les ‘User’ icones utilisées par les devices de votre HC3.
    J’ai laissé de côté les icones de ’room’ (qui ne changent pas souvent)
    et les icones de ‘scene’, (paskeu les scènes je ne m’en sers plus du tout, mais c’est une autre histoire).
  2. La restauration des icônes sauvegardées dans l’opération précédente

    Ces deux opérations ont surtout un intérêt en cours de développement lors de retours en arrière via des ‘backup / restore’
     
  3. ET SURTOUT : Un moyen de maintenir/updater/upgrader/modifier/etPlusEncore, les icones d’une QA sans en toucher le code (ou presque...).
    C’était le but premier de ce script, les deux autres fonctionnalités ne sont que des sous-produits de l’intention initiale.

 

C'est en Python (3.11), ne me demandez pas trop pourquoi... Je le fait tourner sous Windows(10) mais a priori ça doit aussi le faire sous linux...

 

Le Zip   HC3IconMgr1.0.2.zip   joint contient :

  • Un (Le) code python dont il est question
  • Un fichier json de paramètres, éditable A EDITER (via notepad++ par exemple),
    qui vous permet d’adapter le code à vos paramètres à vous (l’IP de votre HC3, le mot de passe et le répertoire de sauvegarde)
  • Un ‘template’ de code LUA à insérer dans vos QAs

 

Je termine ce post par les commentaires en tête du code python qui détaillent un peu plus ce qu’il propose.
C’est en ce que j’appelle de l’anglais, en vue d’une publication sur le site ‘concurrent’ :).

 

Bonne journée!

 

PS: J'ai fait pas mal de test mais que cela ne vous empêche pas de créer une sauvegarde avant de faire les vôtres...

 

#___________________________________________________________________________________
# HC3IconMgr.py  Backup and Restore for Home center 3
# this script allows 3 tasks:
# - SAVE all icons on your PC (or any python target) in png format
# - RESTORE above icons to HC3
# - LOAD sets of icons defined in one HC3's globalVariable and for QA, prepare a local variable
#   to be able to use icons by names not by ids
#
# Notes about HC3 icons:
#     There are in fact 3 types of icon set
#       simple one 'unary' that consist in only one png file
#           (applicable for ex to "com.fibaro.multilevelSensor")
#       'binary' one that have 2 icons (one for the OFF state and one for the ON state)
#           (applicable for ex to "com.fibaro.binarySwitch")
#       'multi' one that have 11 icons ranging from 0% to 100% in steps of 10%
#           (applicable for ex to "com.fibaro.multilevelSwitch")
#     User icon sets are internally named by HC3 under Userxxxx with xxxx = id  and id > 1000.
#       This id is the one to give in calls: "fibaro.call(self.id, "setProperty", "deviceIcon",id)"
#     Considering icons on your PC they must follow the 'syntax' below:
#       for 'unary'  set : iconFName.png
#       for 'binary' set : iconFName_0.png and iconFName_100.png
#       for 'multi ' set : iconFName_0.png, iconFName_10.png, iconFName_20.png,... and iconFName_100.png
#     (This is the case when you SAVE HC3 icons sets)
#  last point to notice about HC3 icons philosophy :
#     Each device type has its own icon list, you may me obliged to upload a png more than once
#     to different devices.
#
#
# File organization :
#     SAVE saves icons under a root path defined by sBackupIconsPath in the parameters json file (see below).
#         this path MUST exist before application is launched!!!
#       under this path, directories are created, one per device type found during the HC3 scan.
#       During scan, at text file is created in sBackupIconsPath/getHC3Icons.log,
#       it lists all icon sets found and where they have been saved.
#
#     RESTORE :
#         * Reads all icon sets found in sBackupIconsPath subdirs.
#         * Checks that all required files per set are available.
#         * Checks if the set is not already on the HC3 and upload acordingly.
#       RESTORE does not reload already existing icon set! If run twice it will not do anything the second time...
#       Restoring icons will most probably change ids so RESTORE produces 2 files in sBackupIconsPath::
#         * RestoreHC3Icons.txt (which is like a csv file) containing the old and new icon ids with the device type. Ex:
#               oldId    newId    deviceType
#               1001    1001    com.fibaro.binarySwitch
#               1016    -100    com.fibaro.binarySwitch
#               1021    1021    com.fibaro.binarySwitch
#               1003    1003    com.fibaro.doorSensor
#               1046    1046    com.fibaro.doorSensor
#               1065    1065    com.fibaro.electricMeter
#               1066    1066    com.fibaro.electricMeter
#               1071    1047    com.fibaro.energyMeter
#               In this file, a negative new id means that all required files for this set were not present.
#          * idChanges.json a json file containing a list of changes indexed by OldId, giving newId only for ids
#               that have changed. Ex: {"1016": -100, "1071": 1047}
#
#     LOAD:
#       * First gets what is to be done by reading the globalVariable "g_Icons2Load" from HC3.
#         Here is an exemple for the content of this globalVar:
#           {"filepath":"D:/Users/........./HomeBox/Icone/",  --this is a root dir where to find icons.png
#           "ToLoad":[                    -- this is an array to be able to load many icons for different device type
#               {"id":348,                --this is (an) id used to dertemine device type and if it is a QA or not
#                 "icons":[               -- list of icon set to load
#                   {"LUAname":"QuestPac","fileRoot":"Chauffage/Poele_unknown"},  --png files will be searched in filepath/fileRoot.png or filepath/fileRoot_0.png or..
#                   {"LUAname":"PacOff","fileRoot":"Chauffage/Poele_off_2"}]},    --LUAname is used for QA...
#               {"id":123, --another id with other icons set list
#                 "icons":[
#                   {"LUAname":"Name1","fileRoot":"Meteo/Rain"},  if 123 is a binarySwitch the appli will look for filepath/Meteo/Rain_0.png and filepath/Meteo/Rain_100.png
#               ]
#           }
#           A LUA HC3 code example to generate that variable is provided in the .zip file
#        * For each id found trys to upload it to HC3 (if it does not exists already)
#        * For ids that corresponds to a QA it produces a list indexed by 'LUAname' value giving the id
#           (the new one or the existing one) of the loaded icon. EX:
#                 {"QuestPac": 1098, "PacOff": 1099, "P0M0R0E0": 1100,"P0M0R1E0": 1101}
#          This list is then pushed to the QA in its own variable under the name "myIconIds"
#          The list is UPDATED not cleared, ie old 'LUAname' are not removed.
#          If you want to clean 'myIconIds' remove it from the QA variables before.
#          Then using fibaro.call(self.id, "setProperty", "deviceIcon",myIconIds.LUAname)
#          you will be able to change/reload icons without modifying your code!!
#   
#  LAST :
#  user modifications:
#      this script read a json file HC3IconMgrParam for user config, it may be changed using notepad (for ex),
#      here is an example:
#          {   "host": "192.168.15.17",  #change to you HC3 IP address
#              "port": 80,              # doi not change (?)
#              "sAuthKey": "eW---blah blah blah blah halb halb---1h", #put your authentification key ,
#                 either directly (using 'F12' key result) or using result of base64 encoding of username:password
#              "sBackupIconsPath": "D:/Users/yv---//----/-/Icone/CurrentBackup/" #put here the root for icons backup
#          }
#  to launch application:
#     I run the application under a 'power shell' console using:
#       "py .\HC3IconMgr.py task"   with task = either save,restore or load   
#     Note that this script produces colored messages.
#          For Windows python under power shell, execute once the power shell cmd :
#             Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1  (and restart the console)
#          It enables VT (Virtual Terminal) / ANSI escape sequences
#    
#   and,  I am a NEWBEE in python some of you may cry (laugh) going through this script
#         please forgive me :-)
#
#
#  FOR CURIOUSITY:
#     Most difficult part is the syntax for uploading icon sets, because of lack of fibaro's documentation (as usual).
#     1) it is not a request PUT or POST but some writes to a TCP socket
#     2) format of what is to be sent through this socket was really not clear to me.
#        Thanks to:
#         a) marecki_0luk1 and its (old) AID code for HC2
#         b) wireshark !!!  (F12 does not help for sockets)
#     3) Solution (my solution) is mainly in 'uploadOneIconSet' function for the 'encapsluation' of the data
#        and in 'uploadIcons' function for the payload build.
#____________________________________________________________________________________

 

HC3IconMgr1.0.2.zip

Modifié par yves.guern
bug dans les code zippés
  • Like 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Rebonjour,

Je n'avais pas assez testé le cas ou plusieurs QA renouvellent leur icone => yavait un bug dans l'exemple de code Lua

Corrigé en V1.0.2

Modifié par yves.guern
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

génial :13:ce truc, il va falloir que je vois comment l'utiliser, mais cela correspond à ce que je cherche.

Je n'y connais rien en Python,  mais je vais étudier la question pour savoir si je pourrais le faire tourner sur moon Synology (qui héberge déjà de nombreuses applications php pour la HC3)

Le 01/09/2023 à 08:53, yves.guern a dit :

J’ai laissé de côté les icones de ’room’ (qui ne changent pas souvent)

perso, j'utilise beaucoup les icones room pour voir rapidement le statut de la pièce. Exple :

  • pièce Garage : icône garage ouvert si une des 2 portes est ouverte, sinon icône garage fermé
  • pièce Piscine (extérieure) : volet ouvert ou fermé
  • ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

  • Python c'est un peu âpre au début mais on s'y fait :-)
    Et aucun doute que cela tourne sur un Synology...
  • Ajouter les icônes de room ne devrait pas être un problème, je peux donner un coup de main

Bonne journée

Partager ce message


Lien à poster
Partager sur d’autres sites

merci pour l'info !

Les icônes 'room', c'était juste une idée pour une prochaine version ...

Partager ce message


Lien à poster
Partager sur d’autres sites

×